Funzione helper per creare url multilingua su CodeIgniter 4
Questa guida può essere utile quando abbiamo delle Named Routes in lingue diverse. In genere, vogliamo usare lo stesso nome di route per diverse lingue, ma per farlo dobbiamo usare la lingua come prefisso. Vediamo come fare.
Tabella dei contenuti
Creare la funzione helper route()
Creiamo il file 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;
}
}
Se usiamo un nome di route come {locale}.posts.index o anche solo posts.index otterremo il link alla named route, se è configurata nella nostra lista di route.
Registrare l'helper
Quindi aggiungiamo il nuovo helper nel nostro BaseController.php
// app/Controllers/BaseController.php
// altro codice...
protected $helpers = [
// altri helpers...
'route'
];
// altro codice...
Impostare le route multilingua
Il seguente è solo un esempio di come potremmo impostare le nostre route:
// app/Config/development/Routes.php
# Inglese
$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']);
});
# 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']);
});
Creare il link per la named route nelle nostre view
Ora possiamo inserire il link nella view:
// app/Views/Login/form.php
// Potremmo fare un form così
<?= form_open_multipart(route('login')) ?>
...
<?= form_close() ?>
// E i link in questo modo:
// app/Views/layouts/base.php
<ul class="navbar">
<li>
<a href="<?= route('home') ?>">Homepage</a>
</li>
<li>
<a href="<?= route('posts.index') ?>">All posts</a>
</li>
<li>
<a href="<?= route('posts.new') ?>">New post</a>
</li>
</ul>
Riusciamo quindi replicare su CodeIgniter 4 lo stesso comportamento che Laravel offre con la sua funzione route().
Passare i parametri alla funzione route
Poiché abbiamo aggiunto la possibilità di avere dei parametri, possiamo passarli facilmente in questo modo:
<?= route('posts.show', $post->id) ?>
Cosa ne pensi? Fammelo sapere nei commenti qui sotto! Se ti è piaciuto l'articolo, seguimi anche su Facebook e Youtube!