Laravel Localization mengotak-atik parameter Route Resource
Pada percobaan kedua saya saya menerapkan Multi implementasi bahasa untuk situs Saya bekerja pada dengan menggunakan Route::groupyang prefixessatu {locale}di segmen pertama dari url menggunakan routeMiddleware Kernel. Ini bekerja dengan sangat baik kecuali saat mengambil rute Resourcesdengan parameters.
Pelaksanaannya memiliki cegukan karena untuk beberapa alasan itu berubah parametermenjadi %2F{id}(yang tidak benar) dan tidak mengambil sumber daya yang saya PublicGalleriesControllerminta. Saya tidak mengerti mengapa, karena ketika saya mengarahkan kursor ke jangkar yang dihasilkan hrefsaya melihat format url yang benar. Tetapi ketika saya mengkliknya, berikan 404 Not Foundpesan dengan url yang kacau.
web.php Ini adalah grup rute saya yang merangkum semua rute dengan sebuah fungsi
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 Route Middleware yang dirutekanKernel.php
public function handle($request, Closure $next)
{
\App::setLocale($request->segment(1)); return $next($request);
}
PublicGalleriesController.php Mengambil jalur gambar dari model dan mengembalikannya ke tampilan klien
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'));
}
Ketika saya melayang-layang di atas sebuah link foto kelompok galeri yang terlihat pada index.bladeitu pertunjukkan di browser sudut kiri sebagai: localhost/en/gallery/41. The index.bladeMengambil kelompok galeri kunci primer dan membangun link anchor html dalam satu lingkaran:<a href="{{ url(app()->getLocale(), 'gallery/' . $item['id']) }}">{{$item['descrp']}}</a>
Ketika saya mengklik tautan ini, ia harus PublicGalleriesControllermenjalankan showfungsi dan mengambil semua foto grup galeri itu tetapi mengembalikan a 404 Not Founddengan url di browser yang ditampilkan localhost/en/gallery%2F41. The %2Fsaya percaya adalah Url dikodekan garis miring.
php artisan route:listmenunjukkan showsumber daya sebagai berikut:
| Domain | Method | URI | Name | Action
| Middleware |
+--------+-----------------------------------------+--------------+-----------------------
| | GET|HEAD | {locale}/gallery/{gallery} | gallery.show | App\Http\Controllers\PublicGalleriesController@show
| web,setlocale |
Adakah yang bisa membantu saya untuk memahami mengapa url menjadi sangat berantakan?
Versi Laravel: 5.6.39
Jawaban
Tanda tangan dari urlhelper adalah:
function url($path = null, $parameters = [], $secure = null)
$parametersadalah larik parameter, bukan jalur, jadi ini mengkodekan /yang Anda gunakan, karena parameter adalah segmen URL, bukan jalur.
Anda dapat menyesuaikan panggilan agar urlmemiliki jalur yang lebih lengkap atau menggunakan parameterslarik sebagai segmen tambahan, bukan jalur:
url(app()->getLocale() .'/gallery/'. $item['id']); // 1 argument url(app()->getLocale() .'/gallery', [$item['id']]); // 2 arguments
url(app()->getLocale(), ['gallery', $item['id']]); // 2 arguments
Anda juga bisa menggunakan routehelper:
route('gallery.show', ['locale' => app()->getLocale(), 'gallery' => $item['id']]);
Jika Anda tidak ingin localememasukkan semua URL yang ingin Anda buat dengan routehelper, Anda dapat menyesuaikan middleware Anda untuk menyetel default untuk parameter ini:
public function handle($request, Closure $next)
{
App::setLocale($locale = $request->route('locale'));
URL::defaults(['locale' => $locale]); // set default return $next($request);
}
Sekarang Anda tidak perlu melewatkan parameter itu:
route('gallery.show', ['gallery' => ...]);
Jika Anda ingin agar localeparameter tidak diteruskan ke semua "tindakan" rute Anda (Metode dan penutupan kontroler), hal itu dapat dilakukan juga. Anda dapat menambahkan baris seperti itu ke middleware itu sebelum Anda mengembalikan respons:
$request->route()->forgetParameter('locale');