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.
Tabla de contenidos
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!