Route Resource parametresiyle Laravel Localization mesajlaşması

Sep 22 2020

İkinci denememde, üzerinde çalıştığım bir site için çok dilli bir uygulama uyguladım, bunu kullanarak url'nin ilk bölümünde Route::groupthat prefixesthe {locale}kullanıyorum routeMiddleware Kernel. Bu rotayı alırken dışında çok iyi çalışıyor Resourcesile parameters.

Uygulama o döner nedense bunda bir hıçkırık vardır parameteriçine %2F{id}(doğru değil) ve benim o kaynağı almak yok PublicGalleriesControlleristedi. Nedenini anlamıyorum, çünkü oluşturulan bağlantının üzerine hrefgeldiğimde doğru url biçimini görüyorum. Ama tıkladığımda 404 Not Found, berbat url ile bir mesaj ver .

web.php Bu, bir işlevle tüm yolları kapsayan benim rota grubum

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 Yönlendirilen Ara Yazılım YönlendirmeKernel.php

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

PublicGalleriesController.php Modelden görüntü yollarını alır ve istemci görünümüne döndürür

    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'));
    }

Ne zaman vurgulu görülebilen bir galeri grup fotoğrafı bağlantısı üzerinden index.bladetarayıcıda o gösterildiği gibi sol köşesinde: localhost/en/gallery/41. index.bladeVerilerini geri çağırır galeri grubu birincil anahtarlar ve bir döngü içinde html çapa bağlantılar kurar:<a href="{{ url(app()->getLocale(), 'gallery/' . $item['id']) }}">{{$item['descrp']}}</a>

Bu bağlantıya tıkladığımda PublicGalleriesController, showişlevi çalıştırmalı ve tüm bu galeri grubu fotoğraflarını almalı, bunun yerine 404 Not Foundtarayıcıda görünen url ile bir döndürmelidir localhost/en/gallery%2F41. %2Fİnanıyorum Bir URL eğik çizgi olarak kodlanmış olduğunu.

php artisan route:listshowkaynağı aşağıdaki gibi gösterir :

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

Birisi lütfen url'nin neden bu kadar dağınık olduğunu anlamama yardım edebilir mi?

Laravel sürümü: 5.6.39

Yanıtlar

2 lagbox Sep 22 2020 at 03:49

Yardımcının imzası url:

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

$parametersparametreler dizisidir, bir yol değil, dolayısıyla kullandığınız şeyi kodluyor /, çünkü parametreler bir yol değil URL'nin bir parçası.

urlDaha tam bir yola sahip olması için çağrıyı ayarlayabilir veya parametersdiziyi yollar değil, ek segmentler olarak kullanabilirsiniz :

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

Ayrıca routeyardımcıyı da kullanabilirsiniz :

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

Yardımcı localeile oluşturmak istediğiniz tüm URL'ler için geçiş yapmak zorunda kalmak istemiyorsanız route, ara yazılımınızı bu parametre için bir varsayılan ayarlamak üzere ayarlayabilirsiniz:

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

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

Artık bu parametreyi geçmeniz gerekmiyor:

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

localeParametrenin tüm rota "eylemlerinize" (Denetleyici yöntemleri ve kapanışları) aktarılmasını istemiyorsanız, bu da yapılabilir. Yanıtı döndürmeden önce bu ara katman yazılımına böyle bir satır ekleyebilirsiniz:

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