【问题标题】:How does Laravel call a method in a controller via Route?Laravel 如何通过 Route 调用控制器中的方法?
【发布时间】:2018-06-02 18:16:33
【问题描述】:

我无法理解路由的工作原理。我试图阅读 Illuminate\Routing\Route 但无法理解 Laravel 如何在控制器中调用方法。

假设我们有:

 Route::get('/', 'WelcomeController@index');

我发现你可以这样称呼它

Route::get('/', function () {
    App::call('App\Http\Controllers\WelcomeController@index, []);
});

但我无法读取 Route.php 文件中的任何内容。

【问题讨论】:

  • 你忘记了路由器本身。
  • @lagbox 哦,是的!谢谢你的提示

标签: laravel laravel-routing


【解决方案1】:

在不深入所有细节的情况下,有一些东西可以看:

Router@dispatch -> dispatchRoute
Router@runRoute
Router@runWithinStack
Route@run
   Route@runController
       ControllerDispatcher@dispatch
   Route@runCallable

Illuminate\Routing\RouterIlluminate\Routing\RouteIlluminate\Routing\ControllerDispatcher

这将引导您从调度到控制器本身的实际调用。

【讨论】:

    【解决方案2】:

    如果您看到App\Providers\RouteServiceProvider,您可以找到protected $namespace = 'App\Http\Controllers';

    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    } 
    

    这意味着你所有的 web.php 路由,例如 Route::get('/', 'WelcomeController@index'); 访问 https:://your-domain/App\Http\Controllers\WelcomeController 方法中发送操作index

    【讨论】:

      【解决方案3】:

      这有点像野兽,但简而言之,你有:

      • index.php 将捕获请求并通过Http Kernel 发送。
      • Http Kernel 将尝试将Request 发送到Router
      • 然后Router 将找到适用的Route(如果有的话),获取Route 的所有中间件,将Request 传递给它们,最后将run 传递给Route
      • 这应该会返回一个Response,最终会在index.php 文件中返回,该文件将继续发送。

      注意

      “运行”路由将获取控制器方法或闭包,解决任何依赖关系,然后调用闭包/方法。

      【讨论】:

        猜你喜欢
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多