CodeIgniter 4: Funzione helper route() per link multilingua come su Laravel

CodeIgniter 4: Funzione helper route() per link multilingua come su Laravel

Published 16/12/2022
Updated 28/12/2022
Categories
Tags

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.

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!

Leave a comment

All comments will be subject to approval after being sent. They might be published after several hours.

Fields marked with * are mandatory. Email is optional and will not be published in any case.

No comments have been written so far on this article. Be the first to share your thoughts!

*