我使用此处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']);
答案 0 :(得分:3)
实际上,我对这个问题有点不确定。我将其作为一种生成URL的方法,而不是根据@ rahulsm的答案使用route
帮助器设置其动态参数。
所以,我只是想通了你可以将默认参数设置为UrlGenerator
类。通过收听容器url
和request
重新绑定事件,可以在那里设置默认参数。
内部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
代码段,我过去常常听取url
和request
反弹服务,因为url
是request
'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。