Routenführung


Route

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;
});

hat

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

Subdomain-Namen-Routing

Routing-Gruppen können auch zur Verarbeitung von Subdomain-Namen verwendet werden. Subdomains können genau wie Routen-URIs Routenparameter zugewiesen werden, sodass Sie einen Teil der Subdomain als Parameter für eine Route oder einen Controller erhalten können. Sie können die

-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 der

Name-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

des Modells gibt den Maximalwert der dynamischen Anforderung an. Wenn Ihr
-Modell beispielsweise ein
-Attribut enthält, können Sie den Attributnamen an die

-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 () { 
          //   
       });
  });

UserUser rate_limitthrottle

Formularmethode gefälschtHTML Formulare unterstützen die Verhaltensweisen

,
oder
nicht. Wenn Sie also eine Route aufrufen möchten, die das

-,

- 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.

Dieser Artikel wurde zuerst auf der Website LearnKu.com veröffentlicht.