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

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

Pubblicato il: 16/12/2022
Aggiornato il: 28/12/2022
Categorie
Tag

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

I commenti dovranno essere approvati prima della pubblicazione. Potrebbero apparire dopo diverse ore.

Puoi usare un nome casuale, è utile per permettermi almeno di risponderti. Se scegli di lasciare la tua email, potrai ricevere una notifica quando rispondo al tuo commento.

Nessun commento è stato ancora inviato. Inizia la discussione condividendo la tua opinione!

*