Recherche…
Routage de base
Le routage définit une carte entre les méthodes HTTP et les URI d'un côté et les actions de l'autre. Les routes sont normalement écrites dans le fichier app/Http/routes.php
.
Dans sa forme la plus simple, une route est définie en appelant la méthode HTTP correspondante sur la façade de la route, en passant en paramètre une chaîne correspondant à l'URI (relative à la racine de l'application) et un rappel.
Par exemple: une route vers l'URI racine du site qui renvoie une vue home
ressemble à ceci:
Route::get('/', function() {
return view('home');
});
Un itinéraire pour une post-demande qui fait simplement écho aux variables post:
Route::post('submit', function() {
return Input::all();
});
//or
Route::post('submit', function(\Illuminate\Http\Request $request) {
return $request->all();
});
Routes pointant vers une méthode Controller
Au lieu de définir le rappel en ligne, la route peut faire référence à une méthode de contrôleur dans la syntaxe [ControllerClassName @ Method]:
Route::get('login', 'LoginController@index');
Un itinéraire pour plusieurs verbes
La méthode de match
peut être utilisée pour faire correspondre un tableau de méthodes HTTP pour une route donnée:
Route::match(['GET', 'POST'], '/', 'LoginController@index');
Aussi, vous pouvez utiliser all
pour faire correspondre n'importe quelle méthode HTTP pour un itinéraire donné:
Route::all('login', 'LoginController@index');
Groupes de route
Les routes peuvent être regroupées pour éviter la répétition du code.
Disons que tous les URI avec un préfixe de /admin
utilisent un certain middleware appelé admin
et qu'ils vivent tous dans l'espace de noms App\Http\Controllers\Admin
.
Une manière propre de représenter cela en utilisant des groupes de routage est la suivante:
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']);
});
Route nommée
Les routes nommées servent à générer une URL ou à rediriger vers un itinéraire spécifique. L'avantage d'utiliser une route nommée est que si nous changeons l'URI d'une route à l'avenir, nous n'aurons pas besoin de changer l'URL ou les redirections pointant vers cette route si nous utilisons une route nommée. Mais si les liens ont été générés en utilisant l'URL [par exemple. url('/admin/login')
], il faudrait alors changer partout où il est utilisé.
Les routes nommées sont créées en utilisant as
clé de tableau
Route::get('login', ['as' => 'loginPage', 'uses' => 'LoginController@index']);
ou en utilisant le name
méthode
Route::get('login', 'LoginController@index')->name('loginPage');
Générer une URL à l'aide d'une route nommée
Pour générer une URL en utilisant le nom de la route
$url = route('loginPage');
Si vous utilisez le nom de la route pour la redirection
$redirect = Redirect::route('loginPage');
Paramètres d'itinéraire
Vous pouvez utiliser les paramètres de route pour obtenir la partie du segment URI. Vous pouvez définir un paramètre / s de route facultatif ou requis lors de la création d'un itinéraire. Les paramètres facultatifs ont un ?
ajouté à la fin du nom du paramètre. Ce nom est entre accolades {}
Paramètre facultatif
Route::get('profile/{id?}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Cette route est accessible par domain.com/profile/23
où 23 est le paramètre id. Dans cet exemple, l' id
est transmis en tant que méthode de paramètre dans la view
de ProfileController
. Comme il s'agit d'un paramètre facultatif, l'accès à domain.com/profile
fonctionne domain.com/profile
.
Paramètre requis
Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);
Notez que le nom du paramètre requis n'a pas de ?
à la fin du nom du paramètre.
Accéder au paramètre dans le contrôleur
Dans votre contrôleur, votre méthode d'affichage prend un paramètre du même nom que celui de routes.php
et peut être utilisé comme une variable normale. Laravel se charge d'injecter la valeur:
public function view($id){
echo $id;
}
Attraper tous les itinéraires
Si vous souhaitez intercepter tous les itinéraires, vous pouvez utiliser une expression régulière comme indiqué:
Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');
Important: Si vous avez d'autres itinéraires et que vous ne voulez pas que le fourre-tout interfère, vous devriez le mettre à la fin. Par exemple:
Attraper toutes les routes sauf celles déjà définies
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', '.*');
Les routes sont appariées dans l'ordre où elles sont déclarées
Ceci est un piège commun avec les routes Laravel. Les routes sont appariées dans l'ordre dans lequel elles sont déclarées. Le premier itinéraire correspondant est celui qui est utilisé.
Cet exemple fonctionnera comme prévu:
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show'); Route::get('/posts/{postId}', 'PostController@show');
Une requête get à /posts/1/comments/1
invoquera CommentController@show
. Un appel à /posts/1
invoquera PostController@show
.
Cependant, cet exemple ne fonctionnera pas de la même manière:
Route::get('/posts/{postId}', 'PostController@show'); Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Une requête get à /posts/1/comments/1
invoquera PostController@show
. Un appel à /posts/1
invoquera PostController@show
.
Comme Laravel utilise le premier itinéraire correspondant, la requête vers /posts/1/comments/1
correspond à Route::get('/posts/{postId}', 'PostController@show');
et assigne la variable $postId
à la valeur 1/comments/1
. Cela signifie que CommentController@show
ne sera jamais invoqué.
Routes insensibles à la casse
Les routes dans Laravel sont sensibles à la casse. Cela signifie qu'un itinéraire comme
Route::get('login', ...);
correspondra à une requête GET à /login
mais ne correspondra pas à une requête GET à /Login
.
Afin de rendre vos routes insensibles à la casse, vous devez créer une nouvelle classe de validateur correspondant aux URL demandées par rapport aux routes définies. La seule différence entre le nouveau validateur et le nouveau est qu'il ajoute le modificateur i à la fin de l'expression régulière pour que l'itinéraire compilé permette l'activation de la correspondance insensible à la casse.
<?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));
}
}
Pour que Laravel utilise votre nouveau validateur, vous devez mettre à jour la liste des comparateurs utilisés pour associer l'URL à un itinéraire et remplacer le UriValidator d'origine par le vôtre.
Pour ce faire, ajoutez ce qui suit en haut de votre fichier 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;
});
Cela supprimera le validateur d'origine et ajoutera le vôtre à la liste des validateurs.