Fonction d'aide pour créer des urls multilingues sur CodeIgniter 4
Cela peut être utile lorsque vous avez des routes nommées pour plusieurs langues. En général, vous voulez utiliser le même nom de route pour différentes langues, mais pour ce faire, nous devons préfixer la langue. Voyons comment procéder.
Table des matières
Écriture de la fonction d'aide route()
Créons le fichier app/Helpers/route_helper.php:
// app/Helpers/route_helper.php use CodeIgniter\Router\Exceptions\RouterException ; if (!function_exists('route')) { function route(string $routeName, ...$params) { $locale = service('request')->getLocale() ; $routes = service('routes') ; if (strpos($routeName, '{locale}') !== false) { $routeName = strtr($routeName, ['{locale}' => $locale]) ; } else { $routeName = $locale . '.' . $routeName ; } $reverseRoute = $routes->reverseRoute($routeName, ...$params) ; if (!$reverseRoute) { throw RouterException::forInvalidRoute($routeName) ; } return $reverseRoute ; } }
Si nous utilisons un nom de route comme {locale}.posts.index ou même simplement posts.index, nous obtiendrons le lien vers la route nommée, si elle est configurée dans notre liste de routes bien sûr.
Enregistrement de l'aide
Ensuite, nous ajoutons la nouvelle aide dans notre BaseController.php:
// app/Controllers/BaseController.php // autre code... protected $helpers = [ // autres aides... 'route' ] ; // autre code...
Définition des itinéraires multilingues
Ce qui suit n'est qu'un exemple de la manière dont vous pouvez configurer vos routes :
// app/Config/development/Routes.php # English $routes->group('en', function() use ($routes) { $routes->get('/', [HomeController::class, 'index'], ['as' => 'en.home']) ; $routes->get('posts', [PostController::class, 'index'], ['as' => 'en.posts.index']) ; $routes->get('posts/new', [PostController::class, 'new'], ['as' => 'en.posts.new']) ; $routes->get('posts/(:num)', [PostController::class, 'show/$1'], ['as' => 'en.posts.show']) ; $routes->post('posts/create', [PostController::class, 'create'], ['as' => 'en.posts.create']) ; }) ; # Italian $routes->group('it', function() use ($routes) { $routes->get('/', [HomeController::class, 'index'], ['as' => 'it.home']) ; $routes->get('annunci', [PostController::class, 'index'], ['as' => 'it.posts.index']) ; $routes->get('annunci/nuovo', [PostController::class, 'new'], ['as' => 'it.posts.new']) ; $routes->get('annunci/(:num)', [PostController::class, 'show/$1'], ['as' => 'it.posts.show']) ; $routes->post('annunci/crea', [PostController::class, 'create'], ['as' => 'it.posts.create']) ; }) ;
Création du lien vers la route nommée dans nos vues
Nous pouvons maintenant créer le lien dans les vues :
// app/Views/Login/form.php // Nous pourrions créer un formulaire comme ceci : <?= form_open_multipart(route('login')) ?> ... <?= form_close() ?> // Et des liens comme ceci : // app/Views/layouts/base.php <ul class="navbar"> <li> <a href="<?= route('home') ?>">Page d'accueil</a> </li> <li> <a href="<?= route('posts.index') ?>">Tous les messages</a> </li> <li> <a href="<?= route('posts.new') ?>">Nouveau message</a> </li> </ul>
De cette façon, nous pouvons reproduire sur CodeIgniter 4 le même comportement que Laravel offre avec sa propre fonction route().
Passer des paramètres à la fonction route
Puisque nous avons ajouté la possibilité d'avoir des paramètres, nous pouvons facilement les passer comme ceci :
<?= route('posts.show', $post->id) ?>
Qu'en pensez-vous ? Faites-le moi savoir dans un commentaire ci-dessous ! Si vous avez aimé cet article, suivez-moi sur Facebook et Youtube!