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.