• Aucun résultat trouvé

Cake\Routing\Router::connect($route, $defaults = [], $options = [])

Pour garder votre codeDRY, vous pouvez utiliser les “routing scopes”. Les scopes de Routing permettent non seule- ment de garder votre code DRY mais aident aussi le Router à optimiser son opération. Comme vous l’avez vu précé- demment. Cette méthode va par défaut vers le scope /. Pour créer un scope et connecter certaines routes, nous allons utiliser la méthode scope() :

// Dans config/routes.php

use Cake\Routing\Route\DashedRoute;

Router::scope('/', function ($routes) {

// Connecte la route de 'fallback' générique $routes->fallbacks(DashedRoute::class); });

La méthode connect() prend trois paramètres : l’URL que vous souhaitez faire correspondre, les valeurs par défaut pour les éléments de votre route, et les règles d’expression régulière pour aider le router à faire correspondre les éléments dans l’URL.

Le format basique pour une définition de route est : $routes->connect(

'/url/template',

['default' => 'defaultValue'], ['option' => 'matchingRegex'] );

Le premier paramètre est utilisé pour dire au router quelle sorte d’URL vous essayez de contrôler. L’URL est une chaîne normale délimitée par des slashes, mais peut aussi contenir une wildcard (*) ouLes Eléments de Route. Utiliser une wildcard dit au router que vous êtes prêt à accepter tout argument supplémentaire fourni. Les Routes sans un * ne matchent que le pattern template exact fourni.

Une fois que vous spécifiez une URL, vous utilisez les deux derniers paramètres de connect() pour dire à Ca- kePHP quoi faire avec une requête une fois qu’elle a été matchée. Le deuxième paramètre est un tableau associa- tif. Les clés du tableau devraient être appelées après les éléments de route dans l’URL, ou les éléments par dé- faut : :controller, :action, et :plugin. Les valeurs dans le tableau sont les valeurs par défaut pour ces clés. Regardons quelques exemples simples avant que nous commencions à voir l’utilisation du troisième paramètre de connect() :

$routes->connect(

'/pages/*',

['controller' => 'Pages', 'action' => 'display'] );

Cette route est trouvée dans le fichier routes.php distribué avec CakePHP. Cette route matche toute URL commençant par /pages/ et il tend vers l’action display() de PagesController La requête /pages/products serait mappé vers PagesController->display('products').

En plus de l’étoile greedy /* il y aussi la syntaxe de l’étoile trailing /**. Utiliser une étoile double trailing, va capturer le reste de l’URL en tant qu’argument unique passé. Ceci est utile quand vous voulez utilisez un argument qui incluait un / dedans :

$routes->connect(

'/pages/**',

['controller' => 'Pages', 'action' => 'show'] );

L’URL entrante de /pages/the-example-/-and-proof résulterait en un argument unique passé de the-example-/-and-proof.

Vous pouvez utiliser le deuxième paramètre de connect() pour fournir tout paramètre de routing qui est composé des valeurs par défaut de la route :

$routes->connect(

'/government',

['controller' => 'Pages', 'action' => 'display', 5] );

Cet exemple montre comment vous pouvez utiliser le deuxième paramètre de connect() pour définir les paramètres par défaut. Si vous construisez un site qui propose des produits pour différentes catégories de clients, vous pourriez considérer la création d’une route. Cela vous permet de vous lier à /government plutôt qu’à /pages/display/ 5.

Une utilisation classique du routing peut impliquer la création de segments d’URL qui ne correspondent pas aux noms de vos controllers ou de vos models. Imaginons qu’au lieu de vouloir accéder à une URL /users/some_action/ 5, vous souhaitiez y accéder via /cooks/une_action/5. Pour ce faire, vous devriez configurer la route suivante : $routes->connect(

'/cooks/:action/*', ['controller' => 'Users'] );

Cela dit au Router que toute URL commençant par /cooks/ devrait être envoyée au UsersController. L’action appelée dépendra de la valeur du paramètre :action. En utilisantLes Eléments de Route, vous pouvez créer des routes variables, qui acceptent les entrées utilisateur ou les variables. La route ci-dessus utilise aussi l’étoile greedy. L’étoile greedy indique auRouterque cette route devrait accepter tout argument de position supplémentaire donné. Ces arguments seront rendus disponibles dans le tableauArguments Passés.

Quand on génère les URLs, les routes sont aussi utilisées. Utiliser ['controller' => 'Users', 'action' => 'some_action', 5] en URL va sortir /cooks/some_action/5 si la route ci-dessus est la première correspondante trouvée.

Les routes connectées jusque là fonctionneront avec n’importe quel verbe HTTP. Si vous souhaitez construire une API REST, vous aurez probablement besoin de faire correspondre des actions HTTP à des méthodes de controller différentes. Le RouteBuilder met à disposition des méthodes qui rendent plus facile la définition de routes pour des verbes HTTP spécifiques :

// Crée une route qui ne répondra qu'aux requêtes GET. $routes->get(

'/cooks/:id',

['controller' => 'Users', 'action' => 'view'],

'users:view'

);

// Crée une route qui ne répondra qu'aux requêtes PUT $routes->put(

['controller' => 'Users', 'action' => 'update'],

'users:update'

);

Les méthodes ci-dessus mappent la même URL à des actions différentes en fonction du verbe HTTP utilisé. Les re- quêtes GET pointeront sur l’action “view” tandis que les requêtes PUT pointeront sur l’action “update”. Ces méthodes sont disponibles pour les verbes :

— GET — POST — PUT — PATCH — DELETE — OPTIONS — HEAD

Toutes ces méthodes retournent une instance de Route ce qui vous permet d’utiliser lessetters fluidespour configurer plus précisément vos routes.

Nouveau dans la version 3.5.0 : Les méthodes pour les verbes HTTP ont été ajoutées dans 3.5.0