• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Laravel控制器的解读

php 搞代码 4年前 (2022-01-21) 29次浏览 已收录 0个评论

这篇文章主要介绍了关于Laravel控制器的解读,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

控制器

控制器能够将相关的请求处理逻辑组成一个单独的类, 通过前面的路由和中间件两个章节我们多次强调Laravel应用的请求在进入应用后首现会通过Http Kernel里定义的基本中间件

protected $middleware = [    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,    \App\Http\Middleware\TrimStrings::class,    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,    \App\Http\Middleware\TrustProxies::class,];

然后Http Kernel会通过dispatchToRoute将请求对象移交给路由对象进行处理,路由对象会收集路由上绑定的中间件然后还是像上面Http Kernel里一样用一个Pipeline管道对象将请求传送通过这些路由上绑定的这些中间键,到达目的地后会执行路由绑定的控制器方法然后把执行结果封装成响应对象,响应对象一次通过后置中间件最后返回给客户端。

下面是刚才说的这些步骤对应的核心代码:

namespace Illuminate\Foundation\Http;class Kernel implements KernelContract{    protected function dispatchToRouter()    {        return function ($request) {            $this->app->instance('request', $request);            return $this->router->dispatch($request);        };    }}namespace Illuminate\Routing;class Router implements RegistrarContract, BindingRegistrar{        public function dispatch(Request $request)    {        $this->currentRequest = $request;        return $this->dispatchToRoute($request);    }        public function dispatchToRoute(Request $request)    {        return $this->runRoute($request, $this->findRoute($request));    }        protected function runRoute(Request $request, Route $route)    {        $request->setRoute<div>……本2文来源gaodai.ma#com搞##代!^码@网3</div><code>搞代gaodaima码</code>Resolver(function () use ($route) {            return $route;        });        $this->events->dispatch(new Events\RouteMatched($route, $request));        return $this->prepareResponse($request,            $this->runRouteWithinStack($route, $request)        );    }        protected function runRouteWithinStack(Route $route, Request $request)    {        $shouldSkipMiddleware = $this->container->bound('middleware.disable') &&                            $this->container->make('middleware.disable') === true;        //收集路由和控制器里应用的中间件        $middleware = $shouldSkipMiddleware ? [] : $this->gatherRouteMiddleware($route);        return (new Pipeline($this->container))                    ->send($request)                    ->through($middleware)                    ->then(function ($request) use ($route) {                        return $this->prepareResponse(                            $request, $route->run()                        );                    });        }}namespace Illuminate\Routing;class Route{    public function run()    {        $this->container = $this->container ?: new Container;        try {            if ($this->isControllerAction()) {                return $this->runController();            }            return $this->runCallable();        } catch (HttpResponseException $e) {            return $e->getResponse();        }    }}

我们在前面的文章里已经详细的解释过Pipeline、中间件和路由的原理了,接下来就看看当请求最终找到了路由对应的控制器方法后Laravel是如何为控制器方法注入正确的参数并调用控制器方法的。

解析控制器和方法名

路由运行控制器方法的操作runController首现会解析出路由中对应的控制器名称和方法名称。我们在讲路由那一章里说过路由对象的action属性都是类似下面这样的:

[    'uses' => 'App\Http\Controllers\SomeController@someAction',    'controller' => 'App\Http\Controllers\SomeController@someAction',    'middleware' => ...]
class Route{    protected function isControllerAction()    {        return is_string($this->action['uses']);    }    protected function runController()    {        return (new ControllerDispatcher($this->container))->dispatch(            $this, $this->getController(), $this->getControllerMethod()        );    }        public function getController()    {        if (! $this->controller) {            $class = $this->parseControllerCallback()[0];            $this->controller = $this->container->make(ltrim($class, '\\'));        }        return $this->controller;    }        protected function getControllerMethod()    {        return $this->parseControllerCallback()[1];    }        protected function parseControllerCallback()    {        return Str::parseCallback($this->action['uses']);    }}class Str{    //解析路由里绑定的控制器方法字符串,返回控制器和方法名称字符串构成的数组    public static function parseCallback($callback, $default = null)    {        return static::contains($callback, '@') ? explode('@', $callback, 2) : [$callback, $default];    }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Laravel控制器的解读
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址