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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow