Ricerca…
Routing di base
Il routing definisce una mappa tra i metodi HTTP e gli URI su un lato e le azioni sull'altro. Le rotte sono normalmente scritte nel file app/Http/routes.php
.
Nella sua forma più semplice, una rotta viene definita chiamando il corrispondente metodo HTTP sulla facciata Route, passando come parametri una stringa che corrisponde all'URI (relativo alla root dell'applicazione) e un callback.
Ad esempio: un percorso verso l'URI radice del sito che restituisce una vista a home
assomiglia a questo:
Route::get('/', function() {
return view('home');
});
Un percorso per una richiesta di posta che richiama semplicemente le variabili del post:
Route::post('submit', function() {
return Input::all();
});
//or
Route::post('submit', function(\Illuminate\Http\Request $request) {
return $request->all();
});
Rotte che puntano a un metodo di controllo
Invece di definire il callback in linea, il percorso può fare riferimento a un metodo controller nella sintassi [ControllerClassName @ Method]:
Route::get('login', 'LoginController@index');
Un percorso per più verbi
Il metodo di match
può essere utilizzato per abbinare una matrice di metodi HTTP per una determinata rotta:
Route::match(['GET', 'POST'], '/', 'LoginController@index');
Inoltre puoi utilizzare all
per abbinare qualsiasi metodo HTTP per una determinata rotta:
Route::all('login', 'LoginController@index');
Instradare i gruppi
Le rotte possono essere raggruppate per evitare la ripetizione del codice.
Diciamo che tutti gli URI con un prefisso di /admin
utilizzano un certo middleware chiamato admin
e vivono tutti nello spazio dei nomi App\Http\Controllers\Admin
.
Un modo pulito di rappresentarlo utilizzando i gruppi di percorsi è il seguente:
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']);
});
Percorso con nome
I percorsi denominati vengono utilizzati per generare un URL o reindirizzare a un percorso specifico. Il vantaggio dell'utilizzo di una rotta denominata è, se in futuro cambieremo l'URI di una rotta, non avremmo bisogno di cambiare l'URL o i reindirizzamenti che puntano a quella rotta se stiamo usando una rotta con nome. Ma se i collegamenti sono stati generati usando l'url [es. url('/admin/login')
], quindi dovremmo cambiare ovunque dove viene utilizzato.
I percorsi denominati vengono creati utilizzando as
chiave di array
Route::get('login', ['as' => 'loginPage', 'uses' => 'LoginController@index']);
o usando il name
metodo
Route::get('login', 'LoginController@index')->name('loginPage');
Genera URL usando la rotta denominata
Per generare un url usando il nome del percorso
$url = route('loginPage');
Se si sta utilizzando il nome della rotta per il reindirizzamento
$redirect = Redirect::route('loginPage');
Parametri di percorso
È possibile utilizzare i parametri del percorso per ottenere la parte del segmento URI. È possibile definire un parametro / i di percorso facoltativo o richiesto durante la creazione di un percorso. I parametri opzionali hanno un ?
aggiunto alla fine del nome del parametro. Questo nome è racchiuso tra parentesi graffe {}
Parametro opzionale
Route::get('profile/{id?}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Questo percorso è accessibile da domain.com/profile/23
dove 23 è il parametro id. In questo esempio l' id
viene passato come parametro nel metodo view
di ProfileController
. Poiché si tratta di un parametro facoltativo, l'accesso a domain.com/profile
funziona domain.com/profile
.
Parametro richiesto
Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Si noti che il nome del parametro richiesto non ha un ?
alla fine del nome del parametro.
Accesso al parametro nel controller
Nel tuo controller, il tuo metodo di visualizzazione prende un parametro con lo stesso nome di routes.php
e può essere usato come una variabile normale. Laravel si prende cura di iniettare il valore:
public function view($id){
echo $id;
}
Prendi tutti i percorsi
Se vuoi catturare tutti i percorsi, puoi usare un'espressione regolare come mostrato:
Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');
Importante: se hai altri percorsi e non vuoi che il catch-all interferisca, dovresti metterlo alla fine. Per esempio:
Cattura tutti i percorsi tranne quelli già definiti
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', '.*');
I percorsi sono abbinati nell'ordine in cui sono dichiarati
Questo è un trucco comune con le rotte di Laravel. I percorsi sono abbinati nell'ordine in cui sono dichiarati. La prima route corrispondente è quella che viene utilizzata.
Questo esempio funzionerà come previsto:
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show'); Route::get('/posts/{postId}', 'PostController@show');
Una richiesta get a /posts/1/comments/1
invocherà CommentController@show
. Una richiesta get a /posts/1
invocherà PostController@show
.
Tuttavia, questo esempio non funzionerà nello stesso modo:
Route::get('/posts/{postId}', 'PostController@show'); Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Una richiesta get a /posts/1/comments/1
invocherà PostController@show
. Una richiesta get a /posts/1
invocherà PostController@show
.
Poiché Laravel utilizza il primo percorso abbinato, la richiesta a /posts/1/comments/1
corrisponde a Route::get('/posts/{postId}', 'PostController@show');
e assegna la variabile $postId
al valore 1/comments/1
. Ciò significa che CommentController@show
non verrà mai richiamato.
Percorsi insensibili alle maiuscole
Le rotte in Laravel fanno distinzione tra maiuscole e minuscole. Significa che un percorso come
Route::get('login', ...);
abbinerà una richiesta GET a /login
ma non corrisponderà a una richiesta GET a /Login
.
Per rendere i tuoi percorsi senza distinzione tra maiuscole e minuscole, devi creare una nuova classe di validatore che corrisponda agli URL richiesti rispetto alle route definite. L'unica differenza tra il nuovo validatore e quello esistente è che aggiungerà il modificatore i alla fine dell'espressione regolare per il percorso compilato per attivare la corrispondenza senza distinzione tra maiuscole e minuscole.
<?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));
}
}
Affinché Laravel possa utilizzare il nuovo validatore, è necessario aggiornare l'elenco di dispositivi di corrispondenza utilizzati per associare l'URL a un percorso e sostituire l'UriValidator originale con il proprio.
Per fare ciò, aggiungi quanto segue all'inizio del tuo file routes.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;
});
Questo rimuoverà il validatore originale e aggiungerà il tuo alla lista dei validatori.