Laravel Localization scherza con il parametro Route Resource

Sep 22 2020

Sul mio secondo tentativo ho implementato un'implementazione multilingua per un sito Sto lavorando su utilizzando una Route::groupche prefixesl' {locale}nel primo segmento del URL utilizzando routeMiddleware Kernel. Funziona molto bene tranne quando si recupera il percorso Resourcescon parameters.

L'implementazione ha un singhiozzo in quanto per qualche motivo trasforma il parameterin %2F{id}(che non è corretto) e non recupera la risorsa che ho PublicGalleriesControllerrichiesto. Non capisco perché, perché quando passo il mouse sopra l'ancora generata hrefvedo il formato URL corretto. Ma quando lo clicco, do un 404 Not Foundmessaggio con l'URL incasinato.

web.php Questo è il mio gruppo di rotte che incapsula tutte le rotte con una funzione

Route::group([
    'prefix' => '{locale}',
    'middleware' => 'setlocale',
], function() {

   // all my routes are within this route group including:
   Route::resource('gallery', 'PublicGalleriesController');

   Auth::routes();

   Route::group(['middleware' => 'auth'], function() {

       ...

   });

});

App / Http / Middleware / Localisation.php Instrada il middleware che viene instradatoKernel.php

public function handle($request, Closure $next)
    {
        \App::setLocale($request->segment(1)); return $next($request);
    }

PublicGalleriesController.php Recupera i percorsi dell'immagine dal modello e lo restituisce alla vista client

    public function show($id)
    {
        // Show gallery group images for given group id
        $pics = null; $path = null;
        $path = GalleryGroup::find($id);
        
        $pics = Gallery::select('imagefilename', 'group_id')->where('group_id', $id)->orderBy('id', 'asc')->get()->toArray();

        return view('gallery.show', compact('pics', 'path'));
    }

Quando ho hover su un collegamento foto di gruppo galleria che è visibile sulle index.blademostra nel browser d'angolo da sinistra come: localhost/en/gallery/41. Le index.bladerecupera le chiavi primarie galleria gruppo e costruisce legami di ancoraggio HTML in un ciclo:<a href="{{ url(app()->getLocale(), 'gallery/' . $item['id']) }}">{{$item['descrp']}}</a>

Quando clicco su questo collegamento, dovrebbe tramite la funzione PublicGalleriesControllereseguire la showfunzione e recuperare tutte quelle foto di gruppo della galleria, ma invece restituisce un 404 Not Foundcon l'URL visualizzato nel browser localhost/en/gallery%2F41. Il %2Fcredo è un URL codificato barra.

php artisan route:listmostra la showrisorsa come segue:

| Domain | Method    | URI                         | Name         | Action   
         | Middleware                              |
+--------+-----------------------------------------+--------------+-----------------------
|        | GET|HEAD  | {locale}/gallery/{gallery}  | gallery.show | App\Http\Controllers\PublicGalleriesController@show   
         | web,setlocale                           |

Qualcuno può aiutarmi a capire perché l'URL sta diventando così disordinato?

Versione Laravel: 5.6.39

Risposte

2 lagbox Sep 22 2020 at 03:49

La firma per l' urlassistente è:

function url($path = null, $parameters = [], $secure = null)

$parametersè un array di parametri, non un percorso, quindi codifica l'elemento /che stai utilizzando, poiché i parametri sono un segmento dell'URL non un percorso.

Puoi regolare la chiamata in modo urlda avere un percorso più completo o utilizzare l' parametersarray come segmenti aggiuntivi, non percorsi:

url(app()->getLocale() .'/gallery/'. $item['id']); // 1 argument url(app()->getLocale() .'/gallery', [$item['id']]); // 2 arguments
url(app()->getLocale(), ['gallery', $item['id']]);  // 2 arguments

Puoi anche usare l' routehelper:

route('gallery.show', ['locale' => app()->getLocale(), 'gallery' => $item['id']]);

Se non vuoi dover trasferire localetutti gli URL che desideri generare con l' routehelper, puoi regolare il tuo middleware per impostare un valore predefinito per questo parametro:

public function handle($request, Closure $next)
{
    App::setLocale($locale = $request->route('locale'));

    URL::defaults(['locale' => $locale]); // set default return $next($request);
}

Ora non devi passare quel parametro:

route('gallery.show', ['gallery' => ...]);

Se si desidera che il localeparametro non venga passato a tutte le "azioni" della rotta (metodi e chiusure del controller), è possibile farlo. Puoi aggiungere una riga in questo modo a quel middleware prima di restituire la risposta:

$request->route()->forgetParameter('locale');