То, что я пытаюсь сделать, это сгруппировать несколько префиксов с одним промежуточным программным обеспечением:
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 и вручную тоже не работает!
@ MD.JubairMizan MD.JubairMizan он идет прямо к представлению home, я делаю dd внутри промежуточного программного обеспечения, но он никогда не достигает этого!
Добавьте свой код middleware с вопросом.
Можете ли вы добавить код класса промежуточного программного обеспечения. Также посмотрите, поможет ли это.
Пожалуйста, добавьте промежуточный код
Добавлен промежуточный код!
@Abanoub Кажется, все в порядке, иногда это может быть связано с проблемой кеша. Пожалуйста, очистите кеш и повторите попытку
Очистите кэш и повторите попытку. php artisan cache:clear
очистка кеша тоже не помогает!
it goes directly to the view of the home - вы не показали нам свой маршрут home.
@Don'tPanic, это просто Route::get('/', 'HomeController@index')->name('home');
Важный момент - где это? Если он не входит в показанные вами группы, промежуточное ПО centralize вызываться не будет. Но если он находится внутри групп, это никогда не сработает, потому что у вас есть все эти префиксы. Итак, где это?
@Don'tPanic, это внутри префиксов, разве его не следует вызывать независимо от того, имеет ли URL-адрес эти префиксы или нет, поскольку все они сгруппированы в middleware?
Нет - если он внутри префиксов, значит у вас определен маршрут для чего-то вроде /fr/france/paris/somewhere/, но у вас нет маршрута для /. Поэтому, если вы попытаетесь получить доступ к /, ваше промежуточное ПО не будет запущено, и я предполагаю, что вы получите 404.
@Abanoub это имеет смысл? Я добавил резюме и некоторые подробности в качестве ответа.






Промежуточное ПО группового маршрута называется следующим образом:
В маршрутах/web.php
Route::group(['middleware' => ['centralize']], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
Route::group(['prefix' => \App\Utilities\Centralization::setCountry()], function () {
//routes
});
});
});
В приложении/Http/kernal.php
protected $routeMiddleware = [
'centralize' => \App\Http\Middleware\CentralizeMiddleware::class,
];
В приложении/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);
}
}
}
Вы упомянули в одном редактировании, что:
it goes directly to the view of the home
Таким образом, URL-адрес, который вы посещаете, на самом деле /. И, как поясняется в комментариях, «домашний» маршрут был определен внутри префиксов. Но это означает, что это действительно маршрут для чего-то вроде /fr/france/paris/somewhere/, а нет — маршрут для /.
prefix в маршруте означает, что «этот маршрут применяется к URI с этим префиксом». Если URI не включает этот префикс, эта маршрутизация не применяется.
Это означает, что маршрута для / нет, и его посещение:
не запускать промежуточное ПО centralize;
не найти подходящего маршрута, поэтому выдать 404;
Если вы хотите применить промежуточное ПО centralize к домашнему маршруту, вам нужно разместить его внутри этой группы, но вне префиксов:
Route::middleware(['centralize'])->group(function () {
Route::get('/', 'HomeController@index')->name('home');
Route::group(['prefix' => \App\Utilities\Centralization::setLocale()], function () {
// ...
});
});
Какое сообщение вы получите