Szukaj…
Podstawowy routing
Routing definiuje mapę między metodami HTTP i identyfikatorami URI z jednej strony, a działaniami z drugiej. Trasy są zwykle zapisywane w pliku app/Http/routes.php
.
W najprostszej postaci trasa jest definiowana przez wywołanie odpowiedniej metody HTTP na elewacji trasy, przekazując jako parametry ciąg pasujący do identyfikatora URI (względem katalogu głównego aplikacji) i wywołanie zwrotne.
Na przykład: trasa do korzeni URI strony, która zwraca widok home
wygląda następująco:
Route::get('/', function() {
return view('home');
});
Trasa żądania postu, która po prostu odzwierciedla zmienne postu:
Route::post('submit', function() {
return Input::all();
});
//or
Route::post('submit', function(\Illuminate\Http\Request $request) {
return $request->all();
});
Trasy wskazujące na metodę kontrolera
Zamiast definiować wbudowane wywołanie zwrotne, trasa może odwoływać się do metody kontrolera w składni [ControllerClassName @ Method]:
Route::get('login', 'LoginController@index');
Trasa dla wielu czasowników
Metodę match
można użyć do dopasowania tablicy metod HTTP dla danej trasy:
Route::match(['GET', 'POST'], '/', 'LoginController@index');
Możesz także użyć all
aby dopasować dowolną metodę HTTP dla danej trasy:
Route::all('login', 'LoginController@index');
Grupy tras
Trasy można grupować, aby uniknąć powtarzania kodu.
Załóżmy, że wszystkie identyfikatory URI z prefiksem /admin
używają określonego oprogramowania pośredniego o nazwie admin
i wszystkie znajdują się w przestrzeni nazw App\Http\Controllers\Admin
.
Prosty sposób przedstawienia tego za pomocą grup tras jest następujący:
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']);
});
Nazwana trasa
Nazwane trasy służą do generowania adresu URL lub przekierowań do określonej trasy. Zaletą korzystania z nazwanej trasy jest to, że jeśli zmienimy identyfikator URI trasy w przyszłości, nie będziemy musieli zmieniać adresu URL ani przekierowań wskazujących tę trasę, jeśli używamy nazwanej trasy. Ale jeśli linki zostały wygenerowane przy użyciu adresu URL [np. url('/admin/login')
], wtedy musielibyśmy zmieniać wszędzie tam, gdzie jest używany.
Nazwane trasy są tworzone przy użyciu as
klucz tablicy
Route::get('login', ['as' => 'loginPage', 'uses' => 'LoginController@index']);
lub za pomocą name
metody
Route::get('login', 'LoginController@index')->name('loginPage');
Wygeneruj adres URL, używając nazwanej trasy
Aby wygenerować adres URL przy użyciu nazwy trasy
$url = route('loginPage');
Jeśli używasz nazwy trasy do przekierowania
$redirect = Redirect::route('loginPage');
Parametry trasy
Możesz użyć parametrów trasy, aby uzyskać część segmentu URI. Możesz zdefiniować opcjonalny lub wymagany parametr / parametry trasy podczas tworzenia trasy. Opcjonalne parametry mają ?
dołączany na końcu nazwy parametru. Ta nazwa jest zamknięta w nawiasy klamrowe {}
Opcjonalny parametr
Route::get('profile/{id?}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Dostęp do tej trasy można uzyskać przez domain.com/profile/23
gdzie 23 to parametr id. W tym przykładzie id
jest przekazywany jako parametr w metodzie view
ProfileController
. Ponieważ jest to parametr opcjonalny, dostęp do domain.com/profile
działa dobrze.
Wymagany parametr
Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Zauważ, że nazwa wymaganego parametru nie ma ?
na końcu nazwy parametru.
Dostęp do parametru w kontrolerze
W kontrolerze twoja metoda widoku przyjmuje parametr o tej samej nazwie co nazwa w routes.php
i może być używana jak normalna zmienna. Laravel dba o wartość:
public function view($id){
echo $id;
}
Złap wszystkie trasy
Jeśli chcesz złapać wszystkie trasy, możesz użyć wyrażenia regularnego, jak pokazano:
Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');
Ważne: jeśli masz inne trasy i nie chcesz, aby catch-all przeszkadzał, powinieneś to zakończyć. Na przykład:
Łapanie wszystkich tras z wyjątkiem już zdefiniowanych
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', '.*');
Trasy są dopasowywane w kolejności ich zadeklarowania
Jest to powszechna gotcha z trasami Laravel. Trasy są dopasowywane w kolejności, w której zostały zadeklarowane. Pierwszą pasującą trasą jest ta, która jest używana.
Ten przykład będzie działał zgodnie z oczekiwaniami:
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show'); Route::get('/posts/{postId}', 'PostController@show');
Zapytanie get do /posts/1/comments/1
wywoła CommentController@show
. Żądanie get do /posts/1
wywoła PostController@show
.
Jednak ten przykład nie będzie działał w ten sam sposób:
Route::get('/posts/{postId}', 'PostController@show'); Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Zapytanie get do /posts/1/comments/1
wywoła PostController@show
. Żądanie get do /posts/1
wywoła PostController@show
.
Ponieważ Laravel używa pierwszej dopasowanej trasy, żądanie do /posts/1/comments/1
pasuje do Route::get('/posts/{postId}', 'PostController@show');
i przypisuje zmienną $postId
do wartości 1/comments/1
. Oznacza to, że CommentController@show
nigdy nie zostanie wywołany.
Trasy bez rozróżniania wielkości liter
W trasach w Laravel rozróżniana jest wielkość liter. Oznacza to, że trasa jak
Route::get('login', ...);
dopasuje żądanie GET do /login
ale nie będzie pasowało do żądania GET do /Login
.
Aby w rozróżnianiu wielkości liter w trasach nie była rozróżniana wielkość liter, musisz utworzyć nową klasę walidatora, która będzie dopasowywać żądane adresy URL do zdefiniowanych tras. Jedyną różnicą między nowym walidatorem a istniejącym jest to, że dołącza on modyfikator i na końcu wyrażenia regularnego do skompilowanej trasy, aby przełączyć umożliwić dopasowanie bez rozróżniania wielkości liter.
<?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));
}
}
Aby Laravel mógł używać twojego nowego walidatora, musisz zaktualizować listę dopasowań, które są używane do dopasowania adresu URL do trasy i zastąpić oryginalny UriValidator twoim.
W tym celu dodaj u góry pliku tras.php:
<?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;
});
Spowoduje to usunięcie oryginalnego walidatora i dodanie go do listy walidatorów.