CodeIgniter 4: Función route() para urls multilingües como en Laravel

Función de ayuda para hacer urls multilingües en CodeIgniter 4

Esto puede ser útil cuando tienes Rutas Nombradas para múltiples idiomas. En general, quieres usar el mismo nombre de ruta para diferentes idiomas, pero para hacer esto tenemos que prefijar el idioma. Veamos como.

Escribiendo la función de ayuda route()

Creemos el archivo 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 usamos un nombre de ruta como {locale}.posts.index o incluso simplemente posts. index obtendremos el enlace a la ruta nombrada, si está configurada en nuestra lista de rutas por supuesto.

Registrando el helper

A continuación añadimos el nuevo helper en nuestro BaseController.php:

// app/Controllers/BaseController.php // otro código... protected $helpers = [ // otros helpers... 'ruta' ]; // otro código...

Configuración de las rutas multilingües

Lo siguiente es sólo un ejemplo de cómo podrías configurar tus rutas:

// app/Config/development/Routes.php # Español $routes->group('es', function() use ($routes) { $routes->get('/', [HomeController::class, 'index'], ['as' => 'es.home']); $routes->get('posts', [PostController::class, 'index'], ['as' => 'es.posts.index']); $routes->get('posts/new', [PostController::class, 'new'], ['as' => 'es.posts.new']); $routes->get('posts/(:num)', [PostController::class, 'show/$1'], ['as' => 'es.posts.show']); $routes->post('posts/create', [PostController::class, 'create'], ['as' => 'es.posts.create']); }); # Italiano $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']); });

Creando el enlace a la ruta nombrada en nuestras vistas

Ahora podemos crear el enlace en las vistas:

// app/Views/Login/form.php // Podríamos hacer un formulario así: <?= form_open_multipart(route('login')) ?> ... <?= form_close() ?> // Y enlaces así: // app/Views/layouts/base.php <ul class="navbar"> <li> <a href="<?= route('home') ?>">Página principal</a> </li> <li> <a href="<?= route('posts.index') ?>">Todos los posts</a> </li> <li> <a href="<?= route('posts.new') ?>">Nuevo post</a> </li> </ul>

De esta forma podemos replicar en CodeIgniter 4 el mismo comportamiento que ofrece Laravel con su propia función route().

Pasando parámetros a la función route

Ya que añadimos la posibilidad de tener parámetros, podemos pasarlos fácilmente así:

<?= route('posts.show', $post->id) ?>

¿Qué te ha parecido? ¡Házmelo saber en un comentario más abajo! ¡Si te gusta este artículo, sígueme en Facebook y Youtube!

Deja un comentario

Todos los comentarios estarán sujetos a aprobación después de ser enviados. Es posible que se publiquen después de varias horas.

Puedes usar un apodo al azar, es útil para que al menos pueda responder a tus comentarios. Y si eliges enviar tu correo electrónico, puedes recibir una notificación cada vez que responda a tu comentario.

Aún no se han escrito comentarios sobre este artículo. ¡Sé el primero en compartir tu opinión!

*