Routenführung
Route
- Einfache Straße Umgeleitet von
- Routenparameter
- Benannt Route
- Routengruppe
- Routenmodellbindung
- Fallback-Routing
- Frequenzlimit
- Formularmethode gefälscht
- Auf aktuelle Route zugreifen
Basisroute
Für den Aufbau einer Basisroute ist nur Folgendes erforderlich: URI mit einem 闭包
bietet hier eine sehr einfache und elegante Möglichkeit, Routen zu definieren:
Route::get('foo', function () { return 'Hello World'; });
Standard-Routing-Datei
Alle Laravel-Routen sind in Routing-Dateien im Verzeichnis routes
definiert, und diese Dateien werden automatisch vom Framework geladen. routes/web.php
-Dateien werden zum Definieren von Routen für die web
-Schnittstelle verwendet. Die Routen werden hier der Middleware-Gruppe web
zugewiesen, die Funktionen wie Sitzungsstatus und CSRF-Schutz bereitstellt. In routes/api.php
definierte Routen sind zustandslos und der Middleware-Gruppe api
zugewiesen.
Die meisten Anwendungskonstruktionen beginnen mit der Definition von Routen in der routes/web.php
-Datei. Auf die in routes/web.php
definierten Routen kann durch Eingabe der definierten Routen-URL in einen Browser zugegriffen werden. Sie können beispielsweise http://your-app.dev/user
in Ihren Browser eingeben, um auf die folgende Route zuzugreifen:
Route::get('/user', 'UserController@index');
routes/api.php
Die in der Datei definierten Routen werden über RouteServiceProvider
in einer Routengruppe verschachtelt. Innerhalb dieser Routengruppe wird das URL-Präfix /api
automatisch zu jeder Route in dieser Datei hinzugefügt, sodass Sie es nicht manuell hinzufügen müssen. Sie können dieses Präfix und andere Routengruppenoptionen in der Klasse RouteServiceProvider
ändern.
Verfügbare Routing-Methoden
Mit dem Router können Sie eine Route registrieren, die auf jede HTTP-Anfrage antworten kann:
Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback);
Manchmal müssen Sie sich möglicherweise registrieren Eine Route, die auf jede HTTP-Anfrage antworten kann: Route zur Antwort auf mehrere HTTP-Anfragen. In diesem Fall können Sie die Methode match
verwenden oder die Methode any
verwenden, um eine Implementierung zu registrieren, die auf alle HTTP-Anfragen antwortet . Angeforderte Route:
Route::match(['get', 'post'], '/', function () { // }); Route::any('foo', function () { // });
CSRF-Schutz
Jedes HTML-Formular, das auf eine web
-, POST
- oder PUT
-Route zeigt, die in der Routendatei DELETE
definiert ist Alle sollten ein CSRF-Token-Feld enthalten, andernfalls wird die Anfrage abgelehnt. Weitere Informationen zu CSRF finden Sie in der CSRF-Dokumentation:
<form method="POST" action="/profile"> @csrf ... </form>
Redirect route
wenn Sie To definieren möchten Um zu einem anderen URI umzuleiten, verwenden Sie die Methode Route::redirect
. Mit dieser Methode kann eine Umleitung schnell implementiert werden, ohne dass eine vollständige Route oder ein Controller definiert werden muss:
Route::redirect('/here', '/there');
Route::redirect
gibt standardmäßig den Statuscode 302
zurück. Sie können den Rückgabecode über den dritten Parameter anpassen:
Route::redirect('/here', '/there', 301);
Sie können auch die Route::permanentRedirect
-Methode verwenden, um den 301
-Statuscode zurückzugeben:
Route::permanentRedirect('/here', '/there');
Routenansicht anzeigen
Wenn Ihre Route nur eine Ansicht zurückgeben muss, können Sie die Methode Route::view
verwenden. Es ist genauso praktisch wie redirect
und erfordert keine Definition einer vollständigen Route oder eines Controllers. Die view
-Methode verfügt über drei Parameter, von denen der erste erforderlich ist und der URI ist, der den Ansichtsnamen enthält. Der zweite und erforderliche Parameter ist der Name der Ansicht, die gerendert werden muss. Der dritte Parameter ist ein optionaler Parameter. Sie können ein Array übergeben, und die Daten im Array werden an die Ansicht übergeben:
Route::view('/welcome', 'welcome'); Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
Routenparameter
Erforderliche Parameter
Natürlich muss man manchmal einige erfassen die Route URL-Fragment. Um beispielsweise die Benutzer-ID aus der URL zu erfassen, können Sie dies tun, indem Sie Routenparameter definieren:
Route::get('user/{id}', function ($id) { return 'User '.$id; });
Sie können bei Bedarf auch mehrere Parameter in der Route definieren:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { // });
Die Parameter von Die Route wird normalerweise innerhalb von {}
platziert und Parameternamen dürfen nur Buchstaben enthalten. Gleichzeitig können Routing-Parameter keine -
-Symbole enthalten. Sie können bei Bedarf durch Unterstriche (_
) ersetzt werden. Routenparameter werden der Reihe nach in Routenrückrufe oder Controller eingefügt, unabhängig von den Parameternamen der Rückrufe oder Controller.
Optionale Parameter
Manchmal müssen Sie möglicherweise einen Routenparameter angeben, möchten aber, dass dieser Parameter vorhanden ist verfügbar Ausgewählt. Sie können nach dem Parameter das Tag ?
hinzufügen, um dies zu erreichen. Voraussetzung ist jedoch, dass die entsprechende Variable der Route einen Standardwert
Route::get('user/{name?}', function ($name = null) { return $name; }); Route::get('user/{name?}', function ($name = 'John') { return $name; });
Einschränkungen für reguläre Ausdrücke
Sie können where
für die Routeninstanz verwenden Die Methode schränkt das Format der Routenparameter ein. where
Die Methode akzeptiert Parameternamen und reguläre Ausdrücke, die definieren, wie die Parameter eingeschränkt werden sollen:
Route::get('user/{name}', function ($name) { // })->where('name', '[A-Za-z]+'); Route::get('user/{id}', function ($id) { // })->where('id', '[0-9]+'); Route::get('user/{id}/{name}', function ($id, $name) { // })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
Globale Einschränkungen
Wenn Sie möchten, dass ein bestimmter Routenparameter alle dem gleichen folgt Regulärer Ausdruck Für Ausdruckseinschränkungen verwenden Sie die Methode pattern
in RouteServiceProvider
Definieren Sie diese Muster in der Methode boot
:
/** * 定义你的路由模型绑定, pattern 过滤器等。 * * @return void */ public function boot(){ Route::pattern('id', '[0-9]+'); parent::boot(); }
Sobald diese Regeln definiert sind, werden sie automatisch auf alle Routen angewendet, die diesen Parameternamen verwenden:
Route::get('user/{id}', function ($id) { // 只有在 id 为数字时才执行。 });
Codierung mit Schrägstrich Charaktere
Laravel Routing-Komponenten erlauben alle Zeichen außer /
. Sie müssen where
explizit erlauben, Teil eines Platzhalters zu sein, indem Sie den bedingten regulären Ausdruck /
verwenden:
Route::get('search/{search}', function ($search) { return $search; })->where('search', '.*');
Hinweis: Kodierte Schrägstriche werden nur im letzten Routensegment unterstützt.
Routenbenennung
Routenbenennung kann ganz einfach URLs oder Weiterleitungen für bestimmte Routen generieren. Sie können den Routennamen angeben, indem Sie die Methode name
in der Routendefinition verketten:
Route::get('user/profile', function () { // })->name('profile');
Sie können auch den Routennamen des Controller-Verhaltens angeben:
Route::get('user/profile', 'UserProfileController@show')->name('profile');
Generieren Sie die geroutete Spezifikation URL
Nachdem Sie einen Namen für die Route angegeben haben, können Sie die globale Hilfsfunktion route
verwenden, um einen Link zu generieren oder zur Route weiterzuleiten:
// 生成 URL... $url = route('profile'); // 生成重定向... return redirect()->route('profile');
Wenn es sich um eine benannte Route mit definierter Route handelt Parameter können Sie die Parameter als zweiten Parameter der Funktion route
übergeben, und die angegebenen Parameter werden automatisch in die URL eingefügt. Die entsprechende Position in:
Route::get('user/{id}/profile', function ($id) { // })->name('profile'); $url = route('profile', ['id' => 1]);
Überprüfen Sie die aktuelle Route
Wenn Sie feststellen möchten, ob die aktuelle Anfrage auf eine bestimmte Route verweist, können Sie named
aufrufen die Routing-Instanzmethode. Sie können beispielsweise den aktuellen Routennamen in der Routing-Middleware überprüfen:
/** * 处理一次请求。 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next){ if ($request->route()->named('profile')) { // } return $next($request); }
route group
route group zulässig Sie teilen Routeneigenschaften wie Middleware oder Namespaces über eine große Anzahl von Routen hinweg, ohne diese Eigenschaften für jede Route einzeln zu definieren. Gemeinsame Eigenschaften sollten in Form eines Arrays an den ersten Parameter der Route::group
-Methode übergeben werden.
Middleware
Um allen Routen in einer Routinggruppe Middleware zuzuweisen, rufen Sie < vor Gruppe 🎜> auf Methoden und Middleware werden in der Reihenfolge ausgeführt, in der sie im Array aufgeführt sind: middleware
Route::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // // 使用 first 和 second 中间件 }); Route::get('user/profile', function () { // // 使用 first 和 second 中间件 }); });Namespace Eine weitere Gemeinsamkeit Der Anwendungsfall besteht darin, die Methode
zu verwenden, um dasselbe PHP zu konvertieren Der Namespace wird allen Controllern in der Routing-Gruppe zugewiesen: namespace
Route::namespace('Admin')->group(function () { // 在 "App\Http\Controllers\Admin" 命名空间下的控制器 });Denken Sie daran, dass
standardmäßig Ihre Routing-Dateien in die Namespace-Gruppe importiert, sodass Sie nicht das vollständige RouteServiceProvider
Namespace-Präfix angeben müssen kann zum Registrieren von Controller-Routen verwendet werden. Daher müssen Sie nur den Teil nach dem Namespace AppHttpControllers
angeben. AppHttpControllers
-Methode vor der Gruppe aufrufen, um einen Subdomain-Namen anzugeben: domain
Route::domain('{account}.myapp.com')->group(function () { Route::get('user/{id}', function ($account, $id) { // }); });Routing-Präfix kann verwendet werden
Methode fügt der angegebenen URL in der Routinggruppe ein Präfix hinzu. Beispielsweise können Sie den URIs aller Routen in der Gruppe admin voranstellen: prefix
Route::prefix('admin')->group(function () { Route::get('users', function () { // 匹配包含 "/admin/users" 的 URL }); });
Routennamen-Präfix
Mit derName-Methode kann jedem Routennamen in der Routengruppe eine bestimmte Zeichenfolge hinzugefügt werden. Beispielsweise möchten Sie möglicherweise den Namen aller Gruppenrouten „admin“ voranstellen. Die angegebene Zeichenfolge stimmt genau mit dem angegebenen Präfix für den Routennamen überein, daher stellen wir sicher, dass die nachgestellten .
-Zeichen im Präfix angegeben werden:
Route::name('admin.')->group(function () { Route::get('users', function () { // 指定路由名为 "admin.users"... })->name('users');});
Routenmodellbindung
Wenn Sie eine Modell-ID in eine Route oder ein Controller-Verhalten einfügen, müssen Sie dies abfragen Das zur ID gehörende Modell. Laravel bietet eine Möglichkeit für die Routenmodellbindung, Modellinstanzen direkt und automatisch in Routen einzufügen. Anstatt beispielsweise die ID des Benutzers einzufügen, könnten Sie die gesamte User
-Modellinstanz einfügen, die einer bestimmten ID entspricht.
Implizite Bindung
Laravel löst automatisch die in Routen oder Controller-Aktionen definierten Typhinweise auf. Der Variablenname stimmt überein das Eloquent-Modell des Routensegmentnamens. Zum Beispiel:
Route::get('api/users/{user}', function (App\User $user) { return $user->email; });
Da in diesem Beispiel die Variable $user
durch einen Typhinweis als Eloquent-Modell AppUser
gekennzeichnet ist und der Variablenname mit {user}
im URI übereinstimmt, fügt Laravel das automatisch ein Anforderungs-URI. Die Benutzermodellinstanz, die der übergebenen ID entspricht. Wenn die entsprechende Modellinstanz nicht in der Datenbank gefunden werden kann, wird automatisch eine 404-Ausnahme generiert.
Benutzerdefinierter Schlüsselname
Wenn Sie möchten, dass die Modellbindung beim Abrufen einer bestimmten Modellklasse ein anderes Datenbankfeld als id
verwendet, können Sie „Auf eloquentem Modell umschreiben“getRouteKeyName
Methode:
/** * 获取该模型的路由的自定义键名。 * * @return string */ public function getRouteKeyName(){ return 'slug'; }
Explizite Bindung
Um eine explizite Bindung zu registrieren, verwenden Sie zur Angabe die model
-Methode des Routers die Klasse für die angegebenen Parameter. Definieren Sie diese expliziten Modellbindungen innerhalb der RouteServiceProvider
-Methode in der boot
-Klasse:
public function boot(){ parent::boot(); Route::model('user', App\User::class); }
Als Nächstes definieren Sie eine Route, die die {user}
-Parameter enthält:
Route::get('profile/{user}', function (App\User $user) { // });
Since we have All {user}
-Parameter sind an das AppUser
-Modell gebunden, sodass User
-Instanzen in die Route eingefügt werden. Beispielsweise fügt eine Anfrage für profile/1
die User
-Instanz mit der ID 1 in die Datenbank ein.
Wenn in der Datenbank keine passende Modellinstanz gefunden wird, wird automatisch eine 404-Ausnahme ausgelöst.
Benutzerdefiniertes Logik-Parsing
Wenn Sie benutzerdefinierte Parsing-Logik verwenden möchten, verwenden Sie die Methode Route::bind
. Der an die bind
-Methode übergebene 闭包
akzeptiert den Wert, der den geschweiften Klammern im URI entspricht, und gibt eine Instanz der Klasse zurück, die Sie in die Route einfügen möchten:
/** * 启动应用服务。 * * @return void */ public function boot(){ parent::boot(); Route::bind('user', function ($value) { return App\User::where('name', $value)->first() ?? abort(404); }); }
Alternativ können Sie den überschreiben Eloquentes Modell resolveRouteBinding
Methode weiter. Diese Methode akzeptiert den Wert, der den geschweiften Klammern im URI entspricht, und gibt eine Instanz der Klasse zurück, die Sie in die Route einfügen möchten:
/** * 检索绑定值的模型。 * * @param mixed $value * @return \Illuminate\Database\Eloquent\Model|null */ public function resolveRouteBinding($value){ return $this->where('name', $value)->first() ?? abort(404); }
Fallback-Routing
Verwenden Sie die Route::fallback
-Methode, Sie können Routen definieren, die ausgeführt werden, wenn keine anderen Routen mit der eingehenden Anfrage übereinstimmen. Normalerweise rendern nicht bearbeitete Anfragen automatisch eine „404“-Seite über den Ausnahmehandler der Anwendung. Da Sie jedoch eine routes/web.php
-Route in einer fallback
-Datei definieren können, wird die gesamte Middleware der web
-Middleware auf die Route angewendet. Natürlich können Sie dieser Route bei Bedarf zusätzliche Middleware hinzufügen:
Route::fallback(function () { // });
{note} Die Fallback-Route sollte immer die letzte von Ihrer Anwendung registrierte Route sein.
Zugriffskontrolle
Laravel enthält eine Middleware zur Steuerung des Anwendungszugriffs auf Routen. Wenn Sie es verwenden möchten, weisen Sie die throttle
-Middleware einer Route oder einer Routengruppe zu. throttle
Die Middleware erhält zwei Parameter, die die maximale Anzahl von Anfragen bestimmen, die in einer bestimmten Anzahl von Minuten gestellt werden können. Geben wir beispielsweise eine Routinggruppe an, die authentifiziert ist und auf die Benutzer nicht mehr als 60 Mal pro Minute zugreifen: Das Attribut
-Middleware übergeben, damit dieser zur Berechnung der maximalen Anzahl von Anfragen verwendet wird:
Route::middleware('auth:api', 'throttle:60,1')->group(function () { Route::get('/user', function () { // }); });
User
User
rate_limit
throttle
Formularmethode gefälschtHTML Formulare unterstützen die Verhaltensweisen
,-,
- oder-Verhalten aus einem HTML-Formular definiert, müssen Sie dem Formular ein verstecktes PUT
-Eingabetag hinzufügen. Verwenden Sie den Wert des Felds PATCH
als HTTP-Anforderungsmethode: DELETE
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () { Route::get('/user', function () { // }); });
PUT
Sie können auch die Vorlagenanweisung PATCH
verwenden, um die DELETE
-Eingabe zu generieren: _method
<form action="/foo/bar" method="POST"> <input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> </form>
_method
@method
_method
Auf die aktuelle Route zugreifen
Sie können die Methoden current
, currentRouteName
und currentRouteAction
auf der Routenfassade verwenden, um auf Informationen über die Route zuzugreifen, die die eingehende Anfrage verarbeitet:
<form action="/foo/bar" method="POST"> @method('PUT') @csrf </form>
Wenn Sie alle zugänglichen Methoden kennenlernen möchten, können Sie in der API-Dokumentation mehr über die Route-Fassade und die Basisklasse der Route-Instanz erfahren.