我要做的是将多个前缀与一个中间件组合在一起:
Route::group(['middleware' => ['centralize']], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setCity()], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setArea()], function () {
//routes
});
});
});
});
});
我已将centralize
中间件添加到kernel
:
protected $routeMiddleware = [
...
'centralize'=> \App\Http\Middleware\Centralize::class,
...
];
但是中间件根本没有被调用,这里有什么东西丢失了吗?
编辑:它直接进入家庭的视图,我在dd
内部做middleware
但它从未到达那里!
编辑:中间件代码:
<?php
namespace App\Http\Middleware;
use App\Utilities\Centralization;
use Closure;
use Illuminate\Http\RedirectResponse;
class Centralize
{
/**
* @var \Illuminate\Http\Request
*/
private $request;
/**
* @var array
*/
private $params;
private $location;
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(\Illuminate\Http\Request $request, Closure $next)
{
$this->request = $request;
dd('hit');
$this->params = explode('/', $request->getPathInfo());
$this->figureLocale();
$this->figureCountry();
$this->figureCity();
$this->figureArea();
$this->figureLocation();
$redirection = implode('/', $this->params);
if ($request->getPathInfo() !== $redirection) {
return new RedirectResponse($redirection, 302, ['Vary' => 'Accept-Language']);
}
\View::share([
'countries' => Centralization::getCountries(),
'cities' => Centralization::getCities(),
'areas' => Centralization::getAreas(),
'location' => $this->location
]);
return $next($request);
}
private function figureLocale()
{
//...
}
private function figureCountry()
{
//..
}
private function figureCity()
{
//...
}
private function figureArea()
{
//...
}
private function figureLocation()
{
//...
}
}
编辑:我也尝试过:
Route::middleware(['centralize'])->group(function () {
Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setCity()], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setArea()], function () {
//..
});
});
});
});
});
但是同样的结果,它从来没有打到中间件!
编辑:使用artisan
和手动清除缓存也不起作用!
您在一次编辑中提到:
它直接进入了家庭的视野
所以您访问的URL实际上是/
。正如评论中所阐明的那样,“home”路由被定义为嵌套在前缀中。但这意味着它真的是像/fr/france/paris/somewhere/
这样的路线,而不是/
的路线。
路线中的prefix
表示“此路线适用于具有此前缀的URI”。如果URI不包含该前缀,则不应用此路由。
这意味着没有/
的路线,访问它将:
centralize
中间件;如果你想将你的centralize
中间件应用到你的家庭路线,你需要把它放在那个组中,但在前缀之外:
Route::middleware(['centralize'])->group(function () {
Route::get('/', 'HomeController@index')->name('home');
Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
// ...
});
});
组路由中间件如下所示:
在routes / web.php中
Route::group(['middleware' => ['centralize']], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
//routes
});
});
});
在app / Http / kernal.php中
protected $routeMiddleware = [
'centralize' => \App\Http\Middleware\CentralizeMiddleware::class,
];
在app / Http / Middleware / CentralizeMiddleware.php中
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class CentralizeMiddleware
{
public function handle($request, Closure $next)
{
if (//Your Condition) {
//If true
}
else {
return $next($request);
}
}
}