【问题标题】:Laravel dynamic controller middlewareLaravel 动态控制器中间件
【发布时间】:2019-03-25 10:04:56
【问题描述】:

您好,我有一些路由保存在数据库中,每个路由都有自己的控制器及其中间件,并且通过此路由进行路由;

Route::get('{any}', 'RoutingController@index')->where('any', '.*');

我尝试按如下方式创建新控制器;

$container = app();
$route = $container->make(\Illuminate\Routing\Route::class);
$controllerInstance = $container->make($controller);
return (new ControllerDispatcher($container))->dispatch($route, $controllerInstance, $action);

所以我的 HomeController 这里有一个中间件;

public function __construct()
{
    $this->middleware('guest');
}

但是这并没有得到尊重,因为我猜这不是一个新的请求。有什么办法可以兑现这个中间件吗?

【问题讨论】:

    标签: laravel middleware


    【解决方案1】:

    控制器调度器不是你想要的,因为中间件是控制器之上的一层。你需要跑整条路线:

    在你的RoutingController

    public function index() {
         //Override your route with what it really needs to do
         $route = Route::get(
             {any},
             '\App\Http\Controllers\HomeController@index'
        )->where('any', '.*');
        //Re-handle the request. It should hit your new route.
        app()->make(\Illuminate\Contracts\Http\Kernel::class)->handle(request());
    }
    

    这个想法是你根据请求用它需要做的事情来覆盖你的一般路线。这应该只影响一个请求。

    【讨论】:

    • 谢谢我添加了这个; $route = Route::get(request()->path(),(string)$controllerAction); $route->bind(request()); return $route->run(); 这不会在来宾控制器中运行中间件。有什么想法吗?
    • 对不起,这是我的错。原来$route->run 只是做了你开始做的事情。您需要Kernel::handle 才能浏览整个堆栈。试试更新的代码。
    • @apokryfos 在这一行内app()->make(\Illuminate\Contracts\Http\Kernel::class)->handle(request()); 我有错误消息Target [Illuminate\Contracts\Http\Kernel] is not instantiable Laravel 版本 8。请问您有什么想法吗?
    • @dave101ua 需要引导应用程序才能工作,即所有提供程序都需要运行。如果您仍然有问题,您可以尝试提供您的实际内核类,通常是\App\Http\Kernel
    猜你喜欢
    • 2023-03-18
    • 2017-10-17
    • 2014-06-24
    • 1970-01-01
    • 2023-03-05
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多