🚦 Routing
Introduction
Le routing vous permet de maper une URL sur un controlleur ou une action particulière.
Le système de routing de Bow est greffé directement sur l'instance de l'application,
donc sur la variable $app
qui est une variable super global.
Les routes de l'application sont dans le fichier app.php
du dossier routing
de votre application.
Mappage d'URL
Avec le méthode route
C'est méthode permet de faire un mappage rélativement simple.
$app->route([
'path' => '/',
'method' => "GET",
'handler' => 'handler'
]);
Liste des options
Paramètre | Type | Description |
---|---|---|
path | String | Le parten d'url à matcher |
method | String , Array | méthode Http |
handler | String , Array | L'action à lancer |
middleware | String , Array | Middleware |
where | String , Array | Contrainte appliqué sur l'URL |
name | String , Array | Le nom de la route |
method
correspond au verbe http
à associer à la route, soit GET
, POST
, PUT
, DELETE
, OPTIONS
, PATCH
.
- Avec une clourse
$app->route([
'path' => '/',
'method' => "GET",
'handler' => function () {
return "Hello, bow";
}
]);
- Avec le nom d'un controlleur.
$app->route([
'path' => '/',
'method' => "GET",
'handler' => 'HomeController::action'
]);
Plus d'information sur les controlleurs ici
- Avec le nom d'un controlleur et un middelware.
$app->route([
'path' => '/',
'method' => "GET",
'handler' => 'HomeController::show',
'middleware' => ['auth']
]);
Plus d'information sur les middlewares ici
- Avec le nom d'un controlleur, un middelware et une restriction.
$app->route([
'path' => '/:name',
'method' => "GET",
'handler' => 'HomeController::show',
'middleware' => ['auth'],
'where' => ['name' => '[a-z]+']
]);
Plus d'information sur les restrictions ici
En utilisant les verbes HTTP comme méthode
Prototype des méthodes du routing.
$app->[method](url, action);
method
correspond au verbe http
à associer à la route, soit GET
, POST
, PUT
, DELETE
, OPTIONS
, PATCH
écrit en minuscule.
Paramètre | Type | Description |
---|---|---|
url | String | Le parten d'url a matcher |
action | String , Array | Closure ou Callable |
- Avec une clourse
$app->get('/', function ()
{
return 'hello world';
});
Une Closure est une fonction dite anonyme (Plus d'information sur le sujet).
- Avec une collection de fonction dans un tableau:
$callables = [];
$callables[] = function ()
{
echo 'hello world';
return true;
};
$callables[] = function ()
{
echo 'Bien merci';
};
$app->get('/', $callables);
Notez que dans la première fonction il y a à la fin une instruction
return true
, cette instruction est indispensable si vous voulez lancer la prochaine fonction. Alors ce qui veut dire que si c'est aussi unreturn false
la fonctione suivante ne sera pas exécutée.
- Avec le nom d'un controlleur
$app->[method]('/', 'ClassController::action');
- Avec le nom d'un controlleur et un middelware
$app->[method]('/', ['middleware' => 'ip', 'controller' => 'ClassController::action']);
method
correspond au verbehttp
à associer à la route, soitGET
,POST
,PUT
,DELETE
,OPTIONS
,PATCH
écrit en minuscule.
Liste des possibilités
$app->get($url, $action);
$app->post($url, $action);
$app->put($url, $action);
$app->delete($url, $action);
$app->option($url, $action);
$app->patch($url, $action);
Les methods de mapping
La mise en place du routage se faire donc via les méthodes suivants:
Mapping avec get
Cette méthode permet de maper une URL à une requête de type GET
.
$app->get('/', function ()
{
return 'hello world';
});
Mapping avec post
Cette méthode permet de maper une URL à une requête de type POST
$app->post('/', function ()
{
return 'data posted';
});
Mapping avec put
Cette méthode permet de maper une URL à une requête de type PUT
.
$app->put('/', function ()
{
// Code ici
});
Mapping avec delete
Cette méthode permet de maper une URL à une requête de type DELETE
.
$app->delete('/', function ()
{
// Code ici
});
Mapping avec patch
Cette méthode permet de maper une URL à une requête de type PATCH
.
$app->patch('/', function ()
{
// Code ici
});
Mapping avec options
Cette méthode permet de maper une URL à une requête de type OPTIONS
.
$app->options('/', function ()
{
// Code ici
});
Les méthodes
DELELTE
,PUT
,PATCH
ne sont pas supporter par le navigateur.
Les navigateurs ne supportent pas cette méthode. Alors dans votre formulaire d'envoie, il faudra créer un champs comme ceci:
<input type="hidden" name="_method" value="DELETE">
Ce qui aura pour but de permettre à Bow de comprendre votre requête et c'est valable pour PUT et PATCH.
Tout les méthodes définir ci-dessus retourne l'instance de
Bow\Router\Route::class
. (Plus d'information sur leBow\Router\Route::class
)
Mapping multiple
Mapping avec match
Permet d'associer des méthodes http
sur l'url spécifié.
Prototype de la méthode match
.
$app->match(verbes, url, action);
Paramètre | Type | Description |
---|---|---|
verbes | Array | La liste des méthodes http |
url | String | L'URL de la route |
action | String , Array , Closure | L'action à lancer |
$app->match(['GET', 'POST'], '/users', function ()
{
// Code ici
});
Vous pourrez avoir un code qui faire ceci.
use Bow\Http\Request;
$app->match(['GET', 'POST'], '/users', function (Request $request)
{
if ($request->isPost()) {
// code
} else {
// code
}
});
Plus d'information sur les requêtes HTTP.
Mapping avec any
Permet d'associer tout les méthodes http
sur l'URL spécifier.
Prototype de la méthode any
.
$app->any(url, action);
Paramètre | Type | Description |
---|---|---|
url | String | L'url de la route |
action | String , Array | Closure - L'action à lancer |
$app->any('/', function ()
{
// Code ici
});
Mapping avec prefix
Souvent vous serez amener à grouper vos routes et effectuer un branchement simple pour bien orienté votre logique. Les URLs peuvent souvents se répéter comme ceci:
$app->get('users', function ()
{
// Code ici
});
$app->get('users/:id', function ($id)
{
// Code ici
});
$app->get('users/:id/delete', function ($id)
{
// Code ici
});
Dans ce cas nous avons users
qui se répéte plusieur fois. Comment bien organiser tout ça ? La réponse est le préfixage de route. Alors la méthodes prefix
nous permet de grouper plusieur URLs.
Prototype de le méthode prefix
.
$app->prefix(url, action);
Paramètre | Type | Description |
---|---|---|
url | String | l'URL à prefixer |
action | Closure | Cette fonction prendra en paramètre l'instance de l'application |
Donc pour réorganiser le code précédent, il faudra faire comme suit:
$app->prefix('/users', function () use ($app)
{
$app->get('/', function ()
{
// Code ici
});
$app->get('/:id', function ($id)
{
// Code ici
});
$app->get('/:id/delete', function ($id)
{
// Code ici
});
});
Notez qu'actuellement le préfixage ne peut pas être imbriquer.
Personnalisation
Le routing vous permet aussi de personnaliser vos URLs. Voici la liste des possibilités de personnalisation.
- Capturer des variables dans l'URL
- Ajouter des critères, des restrictions sur les URLs
- Donner un nom aux routes
- Association de middleware
- La composition d'action
Pour faire la personnalisation il faut utiliser l'enchainement de méthode. Dans l'exemple qui suit nous allons utiliser la méthode get
.
Capturer des variables dans l'URL
Le routing vous permet de pouvoir capturer des variables dans URLs.
Pour le faire il faut impérativement utiliser la notation :nom_variable
.
Ensuite la variable capturé sera passée en paramètre à l'action (fonction à exècuter dans le cas où l'url est valide)
quelque soit le nombre de variable.
$app->get('/:name', function ($name)
{
return 'Bonjour ' . $name;
});
Ajouter des critères, des restrictions sur les URLs
Parlant de capture de variable, sécurisé ces variables est primordial, alors le routing vous permet
aussi d'ajouter des validateurs sur le variable. C'est la méthode where
qui s'en occupe.
Prototype de la méthode where
.
where(name, rule);
// ou
where(array rules);
Paramètre | Type | Description |
---|---|---|
name | String | Le nom de la variable |
value | String | Le critaire de validation |
rules | Array | Tableau associatif dont la clé est la varibale à sécuriser et la valeur est le critaire de validation |
$app->get('/:name', function ($name)
{
return 'Bonjour ' . $name;
})->where('name', '[a-z]+');
// S'il y a plusieurs variables
$callable = function ($name, $lastname, $number)
{
return sprintf(
'Bonjour <b>%s %s</b>, votre numéro est %s.', $name, $lastname, $number
);
};
$app->get('/:name/:lastname/:number', $callable)
->where([
'name' => '[a-z]+',
'lastname' => '[a-z]+',
'number' => '\d+'
]);
Notez que
where
est une méthode de l'instanceBow\Router\Route
.
Donner un nom aux routes
Quand vous être dans le développement d'un gros projet, les routes deviendront nombreuses
et la gestion visuel pour le développeur deviendra difficile, alors Bow vous permet de donner des noms à vos routes et pour après les contacter plus facilement. La méthode name
associate à une instance de route vous permet de faire ça.
Prototype de la méthode name
.
name(name);
Paramètre | Type | Description |
---|---|---|
name | String | Le nom de la route |
$app->get('/:name', function ($name)
{
return 'Bonjour ' . $name;
})->name('hello');
Association de middleware
Un middleware c'est un ou plusieurs actions qui ce placent entre la requête et l'action à exècuter. Tout les Frameworks modernes en sont dotés.
Pour plus d'information sur le sujet, allez ce lien middleware
$app->get('/:name', ['middleware' => 'ip', function ($name)
{
return 'Bonjour ' . $name;
}]);
// Ou
$app->get('/:name', function ($name) {
return 'Bonjour ' . $name;
})->middleware('ip');
La composition d'action
$app->get('/:name', [
'middleware' => 'ip',
'controller' => 'NameController::action'
]);
Il manque quelque chose ?
Si vous rencontrez des problèmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter @bowframework ou sur directement sur le github.