在Laravel中,当URL段数大于1时,RouteGroup中的中间件不要运行
In Laravel when is the number of URL segments more than one, middleware don't run in RouteGroup
我需要将位置添加到所有 URL。我在“RouteServiceProvider.php”中使用了“mapWebRoutes”,如下所示:
protected function mapWebRoutes()
{
$locale = Request::segment(1);
Route::group([
'middleware' => 'web',
'namespace' => $this->namespace,
'prefix' => $locale
], function ($router) {
require base_path('routes/web.php');
});
}
但是当段数大于1时,中间件不会运行。
例如,位置正确添加到下面的地址。
http://example.com/test
在 return 来自中间件之后 => http://example.com/en/test
但是位置没有添加到下面的地址:
http://example.com/test1/test2
这意味着中间件还没有运行。我在中间件的第一行添加 echo 'test'; exit();
以确保中间件是 运行ning。但是当段数大于1时,中间件不会运行.
我的中间件代码是:
public function handle($request, Closure $next)
{
if (!array_key_exists($request->segment(1), config('translatable.locales'))) {
// Store segments in array
$segments = $request->segments();
// Set the default language code as the first segment
$segments = array_prepend($segments, config('app.fallback_locale'));
// Redirect to the correct url
return redirect()->to(implode('/', $segments));
}
return $next($request);
}
我将 mapWebRoutes() 更改为以下代码并解决了问题:
protected function mapWebRoutes()
{
if (!array_key_exists(Request::segment(1), config('translatable.locales'))) {
Route::group([
'middleware' => ['web'],
'namespace' => $this->namespace
], function ($router) {
require base_path('routes/web.php');
});
} else {
$locale = Request::segment(1);
Route::group([
'middleware' => ['web'],
'namespace' => $this->namespace,
'prefix' => $locale
], function ($router) {
require base_path('routes/web.php');
});
}
}
谢谢。
我按照你的想法也添加了一个条件。
我的 mapWebRoutes
方法中有这个:
if (!Language::isValid($locale))
$locale = '';
Route::middleware(['web', 'lang'])
->namespace($this->namespace)
->prefix($locale)
->group(function () {
require base_path('routes/web/test.php');
require base_path('routes/web/general.php');
require base_path('routes/web/blog.php');
require base_path('routes/web/payments.php');
});
如果语言无效,空值将省略前缀并调用中间件。
我需要将位置添加到所有 URL。我在“RouteServiceProvider.php”中使用了“mapWebRoutes”,如下所示:
protected function mapWebRoutes()
{
$locale = Request::segment(1);
Route::group([
'middleware' => 'web',
'namespace' => $this->namespace,
'prefix' => $locale
], function ($router) {
require base_path('routes/web.php');
});
}
但是当段数大于1时,中间件不会运行。 例如,位置正确添加到下面的地址。
http://example.com/test
在 return 来自中间件之后 => http://example.com/en/test
但是位置没有添加到下面的地址:
http://example.com/test1/test2
这意味着中间件还没有运行。我在中间件的第一行添加 echo 'test'; exit();
以确保中间件是 运行ning。但是当段数大于1时,中间件不会运行.
我的中间件代码是:
public function handle($request, Closure $next)
{
if (!array_key_exists($request->segment(1), config('translatable.locales'))) {
// Store segments in array
$segments = $request->segments();
// Set the default language code as the first segment
$segments = array_prepend($segments, config('app.fallback_locale'));
// Redirect to the correct url
return redirect()->to(implode('/', $segments));
}
return $next($request);
}
我将 mapWebRoutes() 更改为以下代码并解决了问题:
protected function mapWebRoutes()
{
if (!array_key_exists(Request::segment(1), config('translatable.locales'))) {
Route::group([
'middleware' => ['web'],
'namespace' => $this->namespace
], function ($router) {
require base_path('routes/web.php');
});
} else {
$locale = Request::segment(1);
Route::group([
'middleware' => ['web'],
'namespace' => $this->namespace,
'prefix' => $locale
], function ($router) {
require base_path('routes/web.php');
});
}
}
谢谢。 我按照你的想法也添加了一个条件。
我的 mapWebRoutes
方法中有这个:
if (!Language::isValid($locale))
$locale = '';
Route::middleware(['web', 'lang'])
->namespace($this->namespace)
->prefix($locale)
->group(function () {
require base_path('routes/web/test.php');
require base_path('routes/web/general.php');
require base_path('routes/web/blog.php');
require base_path('routes/web/payments.php');
});
如果语言无效,空值将省略前缀并调用中间件。