Route Resource parametresiyle Laravel Localization mesajlaşması
İ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
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');