Routage
Règles de routage par défaut
La règle de routage par défaut de webman est http://127.0.0.1:8787/{contrôleur}/{action}
.
Le contrôleur par défaut est app\controller\IndexController
, et l'action par défaut est index
.
Par exemple, en visitant :
http://127.0.0.1:8787
, cela va par défaut visiter la méthodeindex
de la classeapp\controller\IndexController
.http://127.0.0.1:8787/foo
, cela va par défaut visiter la méthodeindex
de la classeapp\controller\FooController
.http://127.0.0.1:8787/foo/test
, cela va par défaut visiter la méthodetest
de la classeapp\controller\FooController
.http://127.0.0.1:8787/admin/foo/test
, cela va par défaut visiter la méthodetest
de la classeapp\admin\controller\FooController
(consultez Multi-application).
De plus, à partir de webman 1.4, le routage par défaut plus complexe est pris en charge, par exemple :
app
├── admin
│ └── v1
│ └── v2
│ └── v3
│ └── controller
│ └── IndexController.php
└── controller
├── v1
│ └── IndexController.php
└── v2
└── v3
└── IndexController.php
Lorsque vous souhaitez modifier le routage d'une requête, veuillez modifier le fichier de configuration config/route.php
.
Si vous souhaitez désactiver le routage par défaut, ajoutez la configuration suivante à la dernière ligne du fichier de configuration config/route.php
:
Route::disableDefaultRoute();
Routage par fermeture
Ajoutez le code de routage suivant dans config/route.php
:
Route::any('/test', function ($request) {
return response('test');
});
Remarque
Comme la fonction de fermeture ne fait pas partie d'un contrôleur, les variables$request->app
,$request->controller
et$request->action
seront toutes des chaînes vides.
Lorsque l'adresse visitée est http://127.0.0.1:8787/test
, cela retournera la chaîne test
.
Remarque
Le chemin de routage doit commencer par/
, par exemple :
// Mauvaise utilisation
Route::any('test', function ($request) {
return response('test');
});
// Bonne utilisation
Route::any('/test', function ($request) {
return response('test');
});
Routage de classe
Ajoutez le code de routage suivant dans config/route.php
:
Route::any('/testclass', [app\controller\IndexController::class, 'test']);
Lorsque l'adresse visitée est http://127.0.0.1:8787/testclass
, cela retournera la valeur de la méthode test
de la classe app\controller\IndexController
.
Paramètres de routage
Si des paramètres sont présents dans le routage, utilisez {clé}
pour les faire correspondre, et les résultats de la correspondance seront transmis en tant que paramètres des méthodes du contrôleur (à partir du deuxième paramètre), par exemple :
// Corrrespondre à /user/123 ou /user/abc
Route::any('/user/{id}', [app\controller\UserController::class, 'get']);
namespace app\controller;
class UserController
{
public function get($request, $id)
{
return response('Paramètre reçu : '.$id);
}
}
Plus d'exemples :
// Correspond à /user/123, ne correspond pas à /user/abc
Route::any('/user/{id:\d+}', function ($request, $id) {
return response($id);
});
// Correspond à /user/foobar, ne correspond pas à /user/foo/bar
Route::any('/user/{name}', function ($request, $name) {
return response($name);
});
// Correspond à /user, /user/123 et /user/abc
Route::any('/user[/{name}]', function ($request, $name = null) {
return response($name ?? 'tom');
});
// Correspond à toutes les requêtes options
Route::options('[{path:.+}]', function () {
return response('');
});
Groupe de routages
Parfois, le routage contient un préfixe important, dans ce cas, nous pouvons utiliser des groupes de routage pour simplifier la définition. Par exemple :
Route::group('/blog', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
});
Équivalent à :
Route::any('/blog/create', function ($request) {return response('create');});
Route::any('/blog/edit', function ($request) {return response('edit');});
Route::any('/blog/view/{id}', function ($request, $id) {return response("view $id");});
Utilisation de groupe imbriqué :
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
});
});
Middleware de routage
Nous pouvons appliquer un ou plusieurs middleware à une route individuelle ou à un groupe de routes. Par exemple :
Route::any('/admin', [app\admin\controller\IndexController::class, 'index'])->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
Route::group('/blog', function () {
Route::any('/create', function () {return response('create');});
Route::any('/edit', function () {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {response("view $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
Remarque :
Avec webman-framework <= 1.5.6, lorsqu'un middleware est appliqué avec->middleware()
à un groupe, la route actuelle doit se trouver sous ce groupe.
# Exemple d'utilisation incorrect (ceci est valable à partir de webman-framework >= 1.5.7)
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
# Exemple d'utilisation correct
Route::group('/blog', function () {
Route::group('/v1', function () {
Route::any('/create', function ($request) {return response('create');});
Route::any('/edit', function ($request) {return response('edit');});
Route::any('/view/{id}', function ($request, $id) {return response("view $id");});
})->middleware([
app\middleware\MiddlewareA::class,
app\middleware\MiddlewareB::class,
]);
});
Routage de ressources
Route::resource('/test', app\controller\IndexController::class);
// Routage de ressources spécifié
Route::resource('/test', app\controller\IndexController::class, ['index','create']);
// Routage de ressources non défini
// Par exemple, la route d'accès est any /test/notify ou /test/notify/{id}, routeName est test.notify
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
Verbe | URI | Action | Nom de la route |
---|---|---|---|
GET | /test | index | test.index |
GET | /test/create | create | test.create |
POST | /test | store | test.store |
GET | /test/{id} | show | test.show |
GET | /test/{id}/edit | edit | test.edit |
PUT | /test/{id} | update | test.update |
DELETE | /test/{id} | destroy | test.destroy |
PUT | /test/{id}/recovery | recovery | test.recovery |
Génération d'URL
Remarque
La génération d'URL pour les routages imbriqués par groupe n'est pas encore prise en charge
Par exemple, avec le routage :
Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');
Nous pouvons générer l'URL pour ce routage en utilisant la méthode suivante :
route('blog.view', ['id' => 100]); // Renvoie /blog/100
Lors de l'utilisation de l'URL du routage dans les vues, nous pouvons utiliser cette méthode pour générer automatiquement l'URL, évitant ainsi de devoir modifier de nombreuses fichiers de vues en cas de modification de l'adresse du routage.
Obtenir des informations sur les itinéraires
Remarque
Nécessite webman-framework >= 1.3.2
À l'aide de l'objet $request->route
, nous pouvons obtenir des informations sur l'itinéraire de la requête actuelle, par exemple
$route = $request->route; // équivaut à $route = request()->route;
if ($route) {
var_export($route->getPath());
var_export($route->getMethods());
var_export($route->getName());
var_export($route->getMiddleware());
var_export($route->getCallback());
var_export($route->param()); // Cette fonctionnalité nécessite webman-framework >= 1.3.16
}
Remarque
Si la requête actuelle ne correspond à aucun itinéraire configuré dans le fichier config/route.php, alors$request->route
sera null, ce qui signifie qu'en cas d'itinéraire par défaut,$request->route
sera null.
Gérer les erreurs 404
Lorsqu'aucun itinéraire n'est trouvé, le code d'état 404 est renvoyé par défaut et le contenu du fichier public/404.html
est affiché.
Si un développeur souhaite intervenir dans le processus métier lorsque l'itinéraire n'est pas trouvé, il peut utiliser la méthode de secours fournie par webman Route::fallback($callback)
. Par exemple, la logique de code suivante redirige vers la page d'accueil lorsque l'itinéraire n'est pas trouvé.
Route::fallback(function(){
return redirect('/');
});
Par exemple, renvoyer des données json lorsque l'itinéraire n'existe pas, est très utile lorsque webman est utilisé comme interface API.
Route::fallback(function(){
return json(['code' => 404, 'msg' => '404 non trouvé']);
});
Lien connexe : Personnaliser les pages d'erreur 404 et 500
Interface de routage
// Définir l'itinéraire pour n'importe quelle méthode de demande sur $uri
Route::any($uri, $callback);
// Définir l'itinéraire GET sur $uri
Route::get($uri, $callback);
// Définir l'itinéraire POST sur $uri
Route::post($uri, $callback);
// Définir l'itinéraire PUT sur $uri
Route::put($uri, $callback);
// Définir l'itinéraire PATCH sur $uri
Route::patch($uri, $callback);
// Définir l'itinéraire DELETE sur $uri
Route::delete($uri, $callback);
// Définir l'itinéraire HEAD sur $uri
Route::head($uri, $callback);
// Définir plusieurs types de méthode de demande sur l'itinéraire simultanément
Route::add(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $uri, $callback);
// Itinéraire groupé
Route::group($path, $callback);
// Itinéraire de ressources
Route::resource($path, $callback, [$options]);
// Désactiver l'itinéraire par défaut
Route::disableDefaultRoute($plugin = '');
// Route de secours, définir l'itinéraire par défaut
Route::fallback($callback, $plugin = '');
Si l'itinéraire n'a pas de correspondance (y compris l'itinéraire par défaut) et qu'aucun itinéraire de secours n'est défini, une réponse 404 sera renvoyée.
Plusieurs fichiers de configuration d'itinéraire
Si vous souhaitez gérer les itinéraires avec plusieurs fichiers de configuration d'itinéraire, par exemple pour plusieurs applications où chaque application a son propre fichier de configuration d'itinéraire, vous pouvez charger des fichiers de configuration d'itinéraire externes à l'aide de la directive require
.
Par exemple dans config/route.php
<?php
// Charger la configuration d'itinéraire de l'application admin
require_once app_path('admin/config/route.php');
// Charger la configuration d'itinéraire de l'application api
require_once app_path('api/config/route.php');