路由到URL帮助程序默认参数

时间:2017-12-06 12:00:20

标签: php laravel laravel-5

我使用此处https://laracasts.com/discuss/channels/laravel/how-to-prefixing-in-routes-for-localization中的代码为路由添加区域设置前缀。

Route::prefix('{lang?}')->middleware('locale')->group(function() {

    Route::get('/', function () {
        return view('index');
    })->name('index');
});

这个语言环境是可选的,但我的问题是在调用route助手时我应该如何重新注入语言环境。

route('index');

生成:/it//或其他,具体取决于当前的区域设置。

如果尝试过这个没有成功:

Route::resourceParameters(['lang' => 'en']);

2 个答案:

答案 0 :(得分:3)

实际上,我对这个问题有点不确定。我将其作为一种生成URL的方法,而不是根据@ rahulsm的答案使用route帮助器设置其动态参数。

所以,我只是想通了你可以将默认参数设置为UrlGenerator类。通过收听容器urlrequest重新绑定事件,可以在那里设置默认参数。

内部AppServiceProvider启动

$this->app->rebinding('url', function ($url, $app) {
    $url->defaults(['lang' => $app->getLocale()]);
});
$this->app->rebinding('request', function ($app) {
    $app['url']->defaults(['lang' => $app->getLocale()]);
});

然后试着打电话,

route('index') // http://test.dev/en (based on config)
route('index', ['lang' => 'what']) //http://test.dev/what

仅在Laravel 5.5上进行了测试,但我确信也会使用Laravel 5.4。

为了解释更多关于rebinding方法的可用Laravel容器 [1] ,首先了解Laravel request lifecycle是如何工作的。在一行简化的单词中,它应该与一般应用程序的工作方式相同,即:接收请求,执行逻辑,返回响应

在第二部分,出现通常称为bootstrapping的阶段,其中一个逻辑是尝试存储(注册)类(服务),这对于应用程序 [2] 来说非常重要。进入一个容器。因此,无论是针对高端开发人员还是框架本身,都是为了共享甚至只是为了易于调用。

注册后,它将被启动。这个启动过程有几个动作来调用 [3] 。其中一个适合这种情况的是firing (local) events。一旦服务得到解决,它将尝试在此阶段调用所有已注册的回弹函数(监听器)。我只能假设这个目的是为了使应用程序可以轻易地变异"当前解析的实例(服务)。因此,定义rebinding方法来收听被召回的事件是可行的方法。

由于Laravel允许重新解析(重新实例化)一个服务,这意味着我们先前在类中存储的值丢失了 [4] ,等待它被解析(然后是监听器)被叫)是有道理的,对吗?

回到上面的rebinding代码段,我过去常常听取urlrequest反弹服务,因为urlrequest's dependent。它等待request服务完全解析,然后调用setRequest [5] 方法,该方法刷新所需的保存默认参数Illuminate\Routing\RouteUrlGenerator的实例。< / p>

顾名思义,defaults,用于设置URL生成器 [6] 使用的默认命名参数。

CIT

[1]此处的容器同时指代Illuminate\Foundation\Application Illuminate\Container\Container

[2]配置错误处理,配置日志记录,检测应用程序环境

[3]解析类型提示的依赖关系,将缓存中的东西存储/缓存等

[4]除非像保存在课堂上那样保留&#39;静态属性

[5] Illuminate\Routing\UrlGenerator@setRequest

[6] Illuminate\Routing\UrlGenerator,无论是拨打URL::route('route.name')url('your-url')app('url')->route('route.name')还是route('route.name'),都是指同一个班级

答案 1 :(得分:0)

这应该是,

route('index', ['lang' => 'fr']);

更改路线助手
/**
     * Generate a URL to a named route.
     *
     * @param  string  $name
     * @param  array   $parameters
     * @param  bool    $absolute
     * @param  \Illuminate\Routing\Route  $route
     * @return string
     */
    function route($name, $parameters = [], $absolute = true, $route = null)
   {
    if (!isset($parameters['lang'])) $parameters['lang'] = App::getLocale();

        return app('url')->route($name, $parameters, $absolute, $route);
    }

有关详细信息,请参阅link