Zoeken…
Basisroutering
Routing definieert een kaart tussen HTTP-methoden en URI's aan de ene kant en acties aan de andere kant. Routes worden normaal geschreven in het app/Http/routes.php
bestand.
In zijn eenvoudigste vorm wordt een route gedefinieerd door de overeenkomstige HTTP-methode op de route-gevel aan te roepen, waarbij als parameters een string wordt doorgegeven die overeenkomt met de URI (ten opzichte van de root van de toepassing), en een callback.
Bijvoorbeeld: een route naar de root URI van de site die een view- home
teruggeeft home
ziet er als volgt uit:
Route::get('/', function() {
return view('home');
});
Een route voor een postverzoek die eenvoudig de postvariabelen weergeeft:
Route::post('submit', function() {
return Input::all();
});
//or
Route::post('submit', function(\Illuminate\Http\Request $request) {
return $request->all();
});
Routes die wijzen naar een Controller-methode
In plaats van de inline callback te definiëren, kan de route verwijzen naar een controller-methode in de syntaxis van [ControllerClassName @ Method]:
Route::get('login', 'LoginController@index');
Een route voor meerdere werkwoorden
De match
methode kan worden gebruikt om een reeks HTTP-methoden voor een bepaalde route te matchen:
Route::match(['GET', 'POST'], '/', 'LoginController@index');
U kunt ook all
om elke HTTP-methode voor een bepaalde route te matchen:
Route::all('login', 'LoginController@index');
Routegroepen
Routes kunnen worden gegroepeerd om herhaling van codes te voorkomen.
Laten we zeggen dat alle URI's met een voorvoegsel van /admin
een bepaalde middleware genaamd admin
en ze leven allemaal in de App\Http\Controllers\Admin
naamruimte.
Een schone manier om dit weer te geven met behulp van routegroepen is als volgt:
Route::group([
'namespace' => 'Admin',
'middleware' => 'admin',
'prefix' => 'admin'
], function () {
// something.dev/admin
// 'App\Http\Controllers\Admin\IndexController'
// Uses admin middleware
Route::get('/', ['uses' => 'IndexController@index']);
// something.dev/admin/logs
// 'App\Http\Controllers\Admin\LogsController'
// Uses admin middleware
Route::get('/logs', ['uses' => 'LogsController@index']);
});
Benoemde route
Benoemde routes worden gebruikt om een URL te genereren of omleidingen naar een specifieke route. Het voordeel van het gebruik van een benoemde route is dat als we de URI van een route in de toekomst wijzigen, we de URL of omleidingen die naar die route verwijzen niet hoeven te wijzigen als we een benoemde route gebruiken. Maar als de links werden gegenereerd met behulp van de url [bijv. url('/admin/login')
], dan zouden we overal moeten veranderen waar het wordt gebruikt.
Benoemde routes worden gemaakt met behulp as
arraysleutel
Route::get('login', ['as' => 'loginPage', 'uses' => 'LoginController@index']);
of met de methode name
Route::get('login', 'LoginController@index')->name('loginPage');
Genereer URL met behulp van benoemde route
Een URL genereren met de naam van de route
$url = route('loginPage');
Als u de routenaam gebruikt voor omleiding
$redirect = Redirect::route('loginPage');
Routeparameters
U kunt routeparameters gebruiken om het deel van het URI-segment te krijgen. U kunt tijdens het maken van een route een optionele of vereiste routeparameter / s definiëren. Optionele parameters hebben een ?
toegevoegd aan het einde van de parameternaam. Deze naam staat tussen accolades {}
Optionele parameter
Route::get('profile/{id?}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Deze route is toegankelijk via domain.com/profile/23
waarbij 23 de parameter id is. In dit voorbeeld wordt de id
doorgegeven als parameter in view
methode van ProfileController
. Omdat dit een optionele parameter is voor toegang tot domain.com/profile
werkt het prima.
Vereiste parameter
Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Merk op dat de naam van de vereiste parameter geen ?
aan het einde van de parameternaam.
Toegang tot de parameter in de controller
In uw controller neemt uw weergavemethode een parameter met dezelfde naam als die in routes.php
en kan worden gebruikt als een normale variabele. Laravel zorgt voor het injecteren van de waarde:
public function view($id){
echo $id;
}
Vang alle routes
Als u alle routes wilt vangen, kunt u een reguliere expressie gebruiken zoals weergegeven:
Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');
Belangrijk: als je andere routes hebt en je niet wilt dat de catch-all interfereert, moet je deze uiteindelijk plaatsen. Bijvoorbeeld:
Vangen van alle routes behalve al gedefinieerd
Route::get('login', 'AuthController@login');
Route::get('logout', 'AuthController@logout');
Route::get('home', 'HomeController@home');
// The catch-all will match anything except the previous defined routes.
Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');
Routes worden gekoppeld in de volgorde waarin ze zijn aangegeven
Dit is een veel voorkomende gotcha met Laravel-routes. Routes worden gekoppeld in de volgorde waarin ze worden aangegeven. De eerste overeenkomende route is degene die wordt gebruikt.
Dit voorbeeld werkt zoals verwacht:
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show'); Route::get('/posts/{postId}', 'PostController@show');
Een verzoek om /posts/1/comments/1
roept CommentController@show
. Een get-aanvraag voor /posts/1
roept PostController@show
.
Dit voorbeeld werkt echter niet op dezelfde manier:
Route::get('/posts/{postId}', 'PostController@show'); Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Een get-aanvraag voor /posts/1/comments/1
roept PostController@show
. Een get-aanvraag voor /posts/1
roept PostController@show
.
Omdat Laravel de eerste overeenkomende route gebruikt, komt het verzoek om /posts/1/comments/1
overeen met Route::get('/posts/{postId}', 'PostController@show');
en wijst de variabele $postId
aan de waarde 1/comments/1
. Dit betekent dat CommentController@show
nooit zal worden aangeroepen.
Hoofdletterongevoelige routes
Routes in Laravel zijn hoofdlettergevoelig. Het betekent dat een route zoals
Route::get('login', ...);
komt overeen met een GET-aanvraag voor /login
maar komt niet overeen met een GET-aanvraag voor /Login
.
Om uw routes hoofdletterongevoelig te maken, moet u een nieuwe validatorklasse maken die de gevraagde URL's vergelijkt met gedefinieerde routes. Het enige verschil tussen de nieuwe validator en de bestaande is dat deze de i- modifier aan het einde van de reguliere expressie toevoegt voor de gecompileerde route om te schakelen tussen hoofdlettergevoelige overeenkomsten.
<?php namespace Some\Namespace;
use Illuminate\Http\Request;
use Illuminate\Routing\Route;
use Illuminate\Routing\Matching\ValidatorInterface;
class CaseInsensitiveUriValidator implements ValidatorInterface
{
public function matches(Route $route, Request $request)
{
$path = $request->path() == '/' ? '/' : '/'.$request->path();
return preg_match(preg_replace('/$/','i', $route->getCompiled()->getRegex()), rawurldecode($path));
}
}
Om Laravel uw nieuwe validator te laten gebruiken, moet u de lijst met matchers bijwerken die worden gebruikt om de URL aan een route te koppelen en de originele UriValidator door de uwe vervangen.
Om dit te doen, voeg je het volgende toe bovenaan je routes.php-bestand:
<?php
use Illuminate\Routing\Route as IlluminateRoute;
use Your\Namespace\CaseInsensitiveUriValidator;
use Illuminate\Routing\Matching\UriValidator;
$validators = IlluminateRoute::getValidators();
$validators[] = new CaseInsensitiveUriValidator;
IlluminateRoute::$validators = array_filter($validators, function($validator) {
return get_class($validator) != UriValidator::class;
});
Hiermee verwijdert u de oorspronkelijke validator en voegt u die toe aan de lijst met validators.