#laravel #middleware
#laravel #промежуточное программное обеспечение
Вопрос:
Привет, итак, у меня есть несколько маршрутов, которые сохранены в базе данных, каждый из них имеет свой собственный контроллер со своим промежуточным программным обеспечением, и он маршрутизируется по этому маршруту;
Route::get('{any}', 'RoutingController@index')->where('any', '.*');
и я пытаюсь создать новый контроллер следующим образом;
$container = app();
$route = $container->make(IlluminateRoutingRoute::class);
$controllerInstance = $container->make($controller);
return (new ControllerDispatcher($container))->dispatch($route, $controllerInstance, $action);
Итак, у моего HomeController есть промежуточное программное обеспечение здесь;
public function __construct()
{
$this->middleware('guest');
}
Однако это не выполняется, поскольку я предполагаю, что это не новый запрос. Есть ли какой-либо способ, которым я могу использовать это промежуточное программное обеспечение?
Ответ №1:
Диспетчер контроллера — это не то, что вам нужно, потому что промежуточное программное обеспечение находится на уровне выше контроллера. Вам необходимо выполнить весь маршрут:
В вашем RoutingController
public function index() {
//Override your route with what it really needs to do
$route = Route::get(
{any},
'AppHttpControllersHomeController@index'
)->where('any', '.*');
//Re-handle the request. It should hit your new route.
app()->make(IlluminateContractsHttpKernel::class)->handle(request());
}
Идея в том, что вы перезаписываете свой общий маршрут тем, что он должен выполнять на основе запроса. Это должно повлиять только на один запрос.
Комментарии:
1. спасибо, я добавил это;
$route = Route::get(request()->path(),(string)$controllerAction); $route->bind(request()); return $route->run();
и это не запускает промежуточное программное обеспечение в контроллере для гостя. есть идеи?2. Извините, это была моя ошибка. Оказывается,
$route->run
просто делает то, что вы делали с самого начала. Вам нужноKernel::handle
для того, чтобы пройти через весь стек. Попробуйте обновленный код.3. @apokryfos в этой строке
app()->make(IlluminateContractsHttpKernel::class)->handle(request());
у меня появляется сообщение об ошибкеTarget [IlluminateContractsHttpKernel] is not instantiable
Laravel версии 8. У вас есть какие-нибудь идеи, пожалуйста?4. @dave101ua приложение должно быть загружено, чтобы оно работало, т. Е. все поставщики должны быть запущены. Если у вас все еще есть проблемы, вы могли бы попробовать предоставить свой фактический класс ядра обычно
AppHttpKernel