Suche…
Grundlegendes Routing
Routing definiert eine Zuordnung zwischen HTTP-Methoden und URIs auf der einen Seite und Aktionen auf der anderen Seite. Routen werden normalerweise in die Datei app/Http/routes.php
.
In ihrer einfachsten Form wird eine Route definiert, indem die entsprechende HTTP-Methode für die Route-Fassade aufgerufen wird. Als Parameter wird eine Zeichenfolge übergeben, die dem URI (relativ zum Anwendungsstamm) entspricht, und einem Rückruf.
Zum Beispiel: Eine Route zum Stamm-URI der Site, die eine Ansicht nach home
zurückgibt, sieht folgendermaßen aus:
Route::get('/', function() {
return view('home');
});
Eine Route für eine Post-Anfrage, die einfach die Post-Variablen wiedergibt:
Route::post('submit', function() {
return Input::all();
});
//or
Route::post('submit', function(\Illuminate\Http\Request $request) {
return $request->all();
});
Routen, die auf eine Controller-Methode zeigen
Anstatt den Rückruf inline zu definieren, kann die Route auf eine Controller-Methode in der [ControllerClassName @ Method] -Syntax verweisen:
Route::get('login', 'LoginController@index');
Eine Route für mehrere Verben
Die match
Methode kann verwendet werden, um ein Array von HTTP-Methoden für eine bestimmte Route abzugleichen:
Route::match(['GET', 'POST'], '/', 'LoginController@index');
Sie können auch all
, um jede HTTP-Methode für eine bestimmte Route abzugleichen:
Route::all('login', 'LoginController@index');
Routengruppen
Routen können gruppiert werden, um Code-Wiederholungen zu vermeiden.
Angenommen, alle URIs mit dem Präfix /admin
verwenden eine bestimmte Middleware mit dem Namen admin
und sie befinden sich alle im Namensraum App\Http\Controllers\Admin
.
Eine saubere Art, dies mithilfe von Routengruppen darzustellen, lautet wie folgt:
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']);
});
Benannte Route
Benannte Routen werden verwendet, um eine URL zu generieren oder auf eine bestimmte Route umzuleiten. Der Vorteil der Verwendung einer benannten Route besteht darin, dass wir, wenn wir den URI einer Route in der Zukunft ändern, die URL nicht ändern oder Weiterleitungen auf diese Route umleiten müssen, wenn wir eine benannte Route verwenden. Wenn die Links jedoch mit der URL erzeugt wurden [z. url('/admin/login')
], dann müssten wir überall dort wechseln, wo sie verwendet wird.
Benannt Routen verwenden erstellt as
Arrayschlüssel
Route::get('login', ['as' => 'loginPage', 'uses' => 'LoginController@index']);
oder ein Verfahren unter Verwendung von name
Route::get('login', 'LoginController@index')->name('loginPage');
URL mit benannter Route generieren
So erstellen Sie eine URL mit dem Namen der Route
$url = route('loginPage');
Wenn Sie den Routennamen für die Umleitung verwenden
$redirect = Redirect::route('loginPage');
Routenparameter
Sie können Routenparameter verwenden, um den Teil des URI-Segments abzurufen. Sie können einen oder mehrere optionale Routenparameter definieren, während Sie eine Route erstellen. Optionale Parameter haben ein ?
wird am Ende des Parameternamens angehängt. Dieser Name wird in einer geschweiften Klammern {}
Optionaler Parameter
Route::get('profile/{id?}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Auf diese Route kann über domain.com/profile/23
zugegriffen werden, wobei 23 der id-Parameter ist. In diesem Beispiel wird die id
als Parameter in der view
Methode von ProfileController
. Da dies ein optionaler Parameter ist, domain.com/profile
Zugriff auf domain.com/profile
.
Erforderlicher Parameter
Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Beachten Sie, dass der Name des erforderlichen Parameters kein ?
am Ende des Parameternamens.
Zugriff auf den Parameter in der Steuerung
In Ihrer Steuerung nimmt Ihre Ansichtsmethode einen Parameter mit dem gleichen Namen wie in der routes.php
und kann wie eine normale Variable verwendet werden. Laravel sorgt für die Injektion des Wertes:
public function view($id){
echo $id;
}
Fange alle Strecken
Wenn Sie alle Routen abrufen möchten, können Sie einen regulären Ausdruck wie gezeigt verwenden:
Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');
Wichtig: Wenn Sie andere Routen haben und nicht wollen, dass der Catch-All stört, sollten Sie es am Ende setzen. Zum Beispiel:
Alle Routen abfangen, außer bereits definiert
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', '.*');
Routen werden in der Reihenfolge abgeglichen, in der sie deklariert sind
Dies ist ein allgemeines Problem bei Laravel-Routen. Routen werden in der Reihenfolge abgeglichen, in der sie deklariert sind. Die erste passende Route ist die, die verwendet wird.
Dieses Beispiel wird wie erwartet funktionieren:
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show'); Route::get('/posts/{postId}', 'PostController@show');
Eine CommentController@show
an /posts/1/comments/1
CommentController@show
. Eine Get-Anfrage an /posts/1
PostController@show
.
Dieses Beispiel funktioniert jedoch nicht auf dieselbe Weise:
Route::get('/posts/{postId}', 'PostController@show'); Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Eine PostController@show
an /posts/1/comments/1
PostController@show
. Eine Get-Anfrage an /posts/1
PostController@show
.
Da Laravel die erste übereinstimmende Route verwendet, entspricht die Anforderung an /posts/1/comments/1
Route::get('/posts/{postId}', 'PostController@show');
und weist die Variable $postId
dem Wert 1/comments/1
. Dies bedeutet, dass CommentController@show
niemals aufgerufen wird.
Routen ohne Berücksichtigung der Groß- und Kleinschreibung
Die Routen in Laravel unterscheiden zwischen Groß- und Kleinschreibung. Es bedeutet, dass eine Route wie
Route::get('login', ...);
stimmt mit einer GET-Anfrage für /login
überein, jedoch nicht mit einer GET-Anfrage für /Login
.
Damit Ihre Routen nicht zwischen Groß- und Kleinschreibung unterscheiden, müssen Sie eine neue Validator-Klasse erstellen, die die angeforderten URLs mit definierten Routen abgleichen soll. Der einzige Unterschied zwischen dem neuen Validator und dem vorhandenen Validator besteht darin, dass er den i- Modifikator am Ende des regulären Ausdrucks für die kompilierte Route anfügt, um zwischen Groß- und Kleinschreibung zu unterscheiden.
<?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));
}
}
Damit Laravel Ihren neuen Prüfer verwenden kann, müssen Sie die Liste der Übereinstimmungen aktualisieren, die zum Abgleichen der URL mit einer Route verwendet werden, und den ursprünglichen UriValidator durch Ihren ersetzen.
Fügen Sie dazu oben in der Datei routes.php Folgendes hinzu:
<?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;
});
Dadurch wird der ursprüngliche Prüfer entfernt und der Liste der Prüfer hinzugefügt.