我正在开发一个多语言应用程序并试图使中间件将路由{locale}前缀传递给URL。但是现在我不需要在控制器中使用这个{locale}参数,例如:
public function getPost(App\Post $post)
{
return view('welcome')->withPost($post);
}
但除非我将App\Post $post
更改为$locale, App\Post $post
,否则上述代码无效。
问题是因为每当我创建一个新控制器时,我都需要传递$ locale参数。那不太酷。
如何避免将$locale
参数传递给所有控制器?我不需要它,因为我已经在我的中间件上使用它了。
更新:
路由\ web.php
Route::prefix('{locale}')->middleware('locale')->group(function () {
Route::get('/', 'PageController@getHome')->name('welcome');
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
...
// This route must be the last!
Route::get('/{post}', 'PageController@getPost')->name('post');
});
答案 0 :(得分:3)
Laravel的路由类中有一个forgetParameter()方法,它可以删除一个参数被解析为控制器方法。
它可以用于例如在中间件中,通过这样调用它:
$request->route()->forgetParameter('locale');
然后该参数将从控制器调度程序的参数属性中删除,从而不会作为参数解析为控制器方法。
答案 1 :(得分:2)
我在不使用前缀参数的情况下解决了我的问题,但使用了自定义辅助函数。
通过这种方式,我不再需要中间件来解析{locale}前缀参数。请参阅我的自定义帮助程序函数以从URL解析语言环境:
<properties>
<scala.binary.version>2.11</scala.binary.version>
<spark.version>2.1.0</spark.version>
</properties>
现在我只需要在我的Route ::前缀()上使用它,如下所示:
function parseLocale()
{
$locale = Request::segment(1);
$languages = ['pt', 'it', 'fr', 'ru', 'es'];
if (in_array($locale, $languages)) {
App::setLocale($locale);
return $locale;
}
return '/';
}
正如您所看到的,如果您尝试导航到Route::prefix(parseLocale())->group(function () {
Auth::routes();
Route::get('home', 'HomeController@index')->name('home');
Route::get('/', 'PageController@getHome')->name('welcome');
...
,应用程序将以与您尝试导航到www.site.com/pt/something
相同的方式为您提供something
路由。但是如果没有语言环境前缀,Laravel将加载您在www.site.com/something
中设置的默认语言。
谢谢你们!
答案 2 :(得分:0)
如果不需要,请从路由参数中删除{locale}
。听起来你仍然在那里定义了路线。请发布您的routes/web.php
,以便我们验证。
如果您的路线定义如下:
Route::get('/{locale}/{post}', 'PostController@getPost');
Laravel将期望2个参数并绑定第一个参数。例如,'/some-post'
会将'some-post'
绑定到{locale}
,仍然期望{post}
的其他路由参数