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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow