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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow