Промежуточное программное обеспечение Laravel dynamic controller

#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