Sök…


Grundläggande dirigering

Routing definierar en karta mellan HTTP-metoder och URI på ena sidan och åtgärder på den andra. Rutter skrivs normalt i app/Http/routes.php filen.

I sin enklaste form definieras en rutt genom att anropa motsvarande HTTP-metod på Ruttfasaden, som parametrar passerar en sträng som matchar URI (relativt applikationsroten) och en återuppringning.

Till exempel: en rutt till rot-URI för webbplatsen som returnerar en vy home ser så här ut:

Route::get('/', function() {
    return view('home');
});

En rutt för en postbegäran som helt enkelt ekar postvariablerna:

Route::post('submit', function() {
   return Input::all();
});

//or

Route::post('submit', function(\Illuminate\Http\Request $request) {
   return $request->all();
});

Rutter som pekar på en Controller-metod

I stället för att definiera återuppringningens inline kan rutten referera till en styrenhetsmetod i [ControllerClassName @ Method] syntax:

Route::get('login', 'LoginController@index');

En rutt för flera verb

match kan användas för att matcha en rad HTTP-metoder för en given rutt:

Route::match(['GET', 'POST'], '/', 'LoginController@index');

Du kan också använda all att matcha vilken HTTP-metod som helst för en given rutt:

Route::all('login', 'LoginController@index');

Ruttgrupper

Rutter kan grupperas för att undvika kodrepetition.

Låt oss säga att alla URI: er med ett prefix för /admin använder en viss mellanprogram som heter admin och att de alla bor i App\Http\Controllers\Admin namnområdet.

Ett rent sätt att representera detta med hjälp av ruttgrupper är följande:

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

Namngiven rutt

Namngivna rutter används för att generera en URL eller omdirigeringar till en specifik rutt. Fördelen med att använda en namngiven rutt är att om vi ändrar URI för en rutt i framtiden, skulle vi inte behöva ändra URL eller omdirigeringar som pekar på den rutten om vi använder en namngiven rutt. Men om länkarna genererades med hjälp av url [t.ex. url('/admin/login') ], då måste vi ändra överallt där det används.

Namngivna rutter skapas med hjälp av as matrisnyckel

Route::get('login', ['as' => 'loginPage', 'uses' => 'LoginController@index']);

eller med användning av metod name

Route::get('login', 'LoginController@index')->name('loginPage');

Generera URL med namngiven rutt

För att skapa en url med ruttens namn

$url = route('loginPage');

Om du använder ruttnamnet för omdirigering

$redirect = Redirect::route('loginPage');

Ruttparametrar

Du kan använda ruttparametrar för att få del av URI-segmentet. Du kan definiera en valfri eller nödvändig ruttparameter / -rutor medan du skapar en rutt. Valfria parametrar har en ? bifogades i slutet av parameternamnet. Detta namn är inneslutet i en lockigt hängslen {}

Valfri parameter

Route::get('profile/{id?}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);

Denna rutt kan nås via domain.com/profile/23 där 23 är id-parametern. I det här exemplet skickas id som parameter i view för ProfileController . Eftersom detta är en valfri parameter som åtkomst till domain.com/profile fungerar bra.

Obligatorisk parameter

Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);

Observera att det obligatoriska parameternamn inte har ett ? i slutet av parameternamnet.

Åtkomst till parametern i regulatorn

I din controller tar din visningsmetod en parameter med samma namn som den i routes.php och kan användas som en vanlig variabel. Laravel tar hand om att injicera värdet:

public function view($id){
    echo $id;
}

Fånga alla rutter

Om du vill fånga alla rutter kan du använda ett vanligt uttryck som visas:

Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');

Viktigt: Om du har andra rutter och du inte vill att fångarna ska störa, bör du säga till slut. Till exempel:

Att fånga alla rutter utom redan definierat

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', '.*');

Rutter matchas i den ordning de deklareras

Detta är en vanlig gotcha med Laravel-rutter. Rutter matchas i den ordning de deklareras. Den första matchande rutten är den som används.

Detta exempel fungerar som förväntat:

Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Route::get('/posts/{postId}', 'PostController@show');

En begäran om att få /posts/1/comments/1 påkallar CommentController@show . En begäran om att få /posts/1 påkallar PostController@show .

Detta exempel fungerar dock inte på samma sätt:

Route::get('/posts/{postId}', 'PostController@show');
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');

En begäran om att få /posts/1/comments/1 påkallar PostController@show . En begäran om att få /posts/1 påkallar PostController@show .

Eftersom Laravel använder den första matchade rutten matchar begäran till /posts/1/comments/1 Route::get('/posts/{postId}', 'PostController@show'); och tilldelar variabeln $postId till värdet 1/comments/1 . Detta innebär att CommentController@show aldrig kommer att åberopas.

Fall-okänsliga rutter

Rutter i Laravel är skiftlägeskänsliga. Det betyder att en rutt som

Route::get('login', ...);

kommer att matcha en GET-begäran till /login men kommer inte att matcha en GET-begäran till /Login .

För att göra dina rutter falllösa, måste du skapa en ny valideringsklass som matchar begärda URL: er mot definierade rutter. Den enda skillnaden mellan den nya validatorn och den befintliga är att den kommer att lägga till i- modifieraren i slutet av det reguljära uttrycket för den sammanställda rutten för att växla möjliggöra en okänslig matchning av skiftlägen.

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

För att Laravel ska använda din nya validator måste du uppdatera listan med matchare som används för att matcha URL till en rutt och ersätta den ursprungliga UriValidator med din.

För att göra det, lägg till följande högst upp i din routes.php-fil:

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

Detta kommer att ta bort den ursprungliga valideraren och lägga till din i listan över validerare.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow