当前位置: 首页 > news >正文

wordpress网站如何播放视频东莞网站建设优化东莞

wordpress网站如何播放视频,东莞网站建设优化东莞,台州市住房和城乡建设规划局网站,关键词优化如何控制器 控制器能够将相关的请求处理逻辑组成一个单独的类#xff0c; 通过前面的路由和中间件两个章节我们多次强调Laravel应用的请求在进入应用后首现会通过Http Kernel里定义的基本中间件 protected $middleware [\Illuminate\Foundation\Http\Middleware\CheckForMaintena… 控制器 控制器能够将相关的请求处理逻辑组成一个单独的类 通过前面的路由和中间件两个章节我们多次强调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-setRouteResolver(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\SomeControllersomeAction,controller App\Http\Controllers\SomeControllersomeAction,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];} }所以路由通过parseCallback方法将uses配置项里的控制器字符串解析成数组返回, 数组第一项为控制器名称、第二项为方法名称。在拿到控制器和方法的名称字符串后路由对象将自身、控制器和方法名传递给了Illuminate\Routing\ControllerDispatcher类由ControllerDispatcher来完成最终的控制器方法的调用。下面我们详细看看ControllerDispatcher是怎么来调用控制器方法的。 class ControllerDispatcher {use RouteDependencyResolverTrait;public function dispatch(Route $route, $controller, $method){$parameters $this-resolveClassMethodDependencies($route-parametersWithoutNulls(), $controller, $method);if (method_exists($controller, callAction)) {return $controller-callAction($method, $parameters);}return $controller-{$method}(...array_values($parameters));} } 上面可以很清晰地看出ControllerDispatcher里控制器的运行分为两步解决method的参数依赖resolveClassMethodDependencies、调用控制器方法。 解决method参数依赖 解决方法的参数依赖通过RouteDependencyResolverTrait这一trait负责 trait RouteDependencyResolverTrait {protected function resolveClassMethodDependencies(array $parameters, $instance, $method){if (! method_exists($instance, $method)) {return $parameters;}return $this-resolveMethodDependencies($parameters, new ReflectionMethod($instance, $method));}//参数为路由参数数组$parameters(可为空array)和控制器方法的反射对象public function resolveMethodDependencies(array $parameters, ReflectionFunctionAbstract $reflector){$instanceCount 0;$values array_values($parameters);foreach ($reflector-getParameters() as $key $parameter) {$instance $this-transformDependency($parameter, $parameters);if (! is_null($instance)) {$instanceCount;$this-spliceIntoParameters($parameters, $key, $instance);} elseif (! isset($values[$key - $instanceCount]) $parameter-isDefaultValueAvailable()) {$this-spliceIntoParameters($parameters, $key, $parameter-getDefaultValue());}}return $parameters;}} 在解决方法的参数依赖时会应用到PHP反射的ReflectionMethod类来对控制器方法进行方向工程 通过反射对象获取到参数后会判断现有参数的类型提示(type hint)是否是一个类对象参数如果是类对象参数并且在现有参数中没有相同类的对象那么就会通过服务容器来make出类对象。 protected function transformDependency(ReflectionParameter $parameter, $parameters){$class $parameter-getClass();if ($class ! $this-alreadyInParameters($class-name, $parameters)) {return $parameter-isDefaultValueAvailable()? $parameter-getDefaultValue(): $this-container-make($class-name);}}protected function alreadyInParameters($class, array $parameters){return ! is_null(Arr::first($parameters, function ($value) use ($class) {return $value instanceof $class;}));} 解析出类对象后需要将类对象插入到参数列表中去 protected function spliceIntoParameters(array $parameters, $offset, $value){array_splice($parameters, $offset, 0, [$value]);} 我们之前讲服务容器时里面讲的服务解析解决是类构造方法的参数依赖而这里resolveClassMethodDependencies里解决的是具体某个方法的参数依赖它Laravel对method dependency injection概念的实现。 当路由的参数数组与服务容器构造的类对象数量之和不足以覆盖控制器方法参数个数时就要去判断该参数是否具有默认参数也就是会执行resolveMethodDependencies方法foreach块里的else if分支将参数的默认参数插入到方法的参数列表$parameters中去。 } elseif (! isset($values[$key - $instanceCount]) $parameter-isDefaultValueAvailable()) {$this-spliceIntoParameters($parameters, $key, $parameter-getDefaultValue()); } 调用控制器方法 解决完method的参数依赖后就该调用方法了这个很简单, 如果控制器有callAction方法就会调用callAction方法否则的话就直接调用方法。 public function dispatch(Route $route, $controller, $method){$parameters $this-resolveClassMethodDependencies($route-parametersWithoutNulls(), $controller, $method);if (method_exists($controller, callAction)) {return $controller-callAction($method, $parameters);}return $controller-{$method}(...array_values($parameters));} 执行完拿到结果后按照上面runRouteWithinStack里的逻辑结果会被转换成响应对象。然后响应对象会依次经过之前应用过的所有中间件的后置操作最后返回给客户端。 本文已经收录在系列文章Laravel源码学习里欢迎访问阅读。
http://www.yutouwan.com/news/164047/

相关文章:

  • 自助建站系统个人网站网站制作哪家最好
  • 做一个网站大概需要多少钱商城类网站模板
  • apache网站开启gzipseopeixun
  • 免费网站注册com网站抓取超时错误
  • 运营一个网站的费用网页设计十大排名
  • 网站开发的数据库做测评的网站
  • 网站被挂黑链对网站有啥影响做网站运营好还是SEO好
  • 城口自助建站查询建设工程规范的网站
  • 弱电工程公司网站怎么做网络营销推广与策划总结
  • 建设信用卡积分网站企业年金规定
  • 网站开发工程师是做什么的云岭先锋网站是哪家公司做的
  • 济南哪里有网站公司河南建筑网站
  • 医疗网站建设多少钱桂林两江四湖图片
  • 有教做点心的网站吗网站集约化建设的讲话
  • 怎么建个废品网站电子商务网站建设基础项目实训
  • 南昌有什么网站长宁区网站建设网页制作
  • 江苏企业建设网站公司优质的广州微网站建设
  • 宁波东钱湖建设局网站天津企业网站开发
  • 早教网站设计wordpress 付费会员
  • 企业微信手机片网站制作域名备案时网站名称
  • 装饰装修网站大全苏州网站开发公司兴田德润优惠吗
  • 建设网站的公司的官网一 网站建设的总体目标
  • 福建联美建设集团有限公司网站安徽天长建设局网站
  • 网站建设需要哪些成本费用电商网站建设综述
  • 厦门专业网站建设建站好的建站软件
  • 政务信息公开与网站建设报告新华路网站建设
  • 网站的排名和什么因素有关系时间线 wordpress
  • flash网站制作公司网站已经克隆好了 怎么做仿站
  • 网站模板 酒店 中文wordpress删除数据库数据表
  • 贵阳营销型网站建设小程序注册量