CodeIgniter 4 : Fonction route() pour les urls multilingues comme dans Laravel

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.

É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!

Laisser un commentaire

Tous les commentaires seront soumis à approbation après avoir été envoyés. Ils pourront être publiés après quelques heures.

Vous pouvez simplement utiliser un pseudo au hasard, cela me permet au moins de répondre à vos commentaires. Et si vous choisissez de soumettre votre email, vous pouvez recevoir une notification à chaque fois que je réponds à votre commentaire.

Aucun commentaire n'a été rédigé jusqu'à présent sur cet article. Soyez le premier à partager votre opinion !

*