Laravel 5.4:如何在控制器中不使用路由参数

时间:2017-06-18 21:02:13

标签: laravel laravel-5.4

我正在开发一个多语言应用程序并试图使中间件将路由{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');
});

3 个答案:

答案 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}的其他路由参数