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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow