laravel 框架执行流程与原理简单分析
本文实例讲述了laravel框架执行流程与原理。分享给大家供大家参考,具体如下:
1.index.php
$app=require_once__DIR__.'/../bootstrap/app.php'; $kernel=$app->make(Illuminate\Contracts\Http\Kernel::class); $response=$kernel->handle( $request=Illuminate\Http\Request::capture() );
2.进入app.php
$app=newIlluminate\Foundation\Application( $_ENV['APP_BASE_PATH']??dirname(__DIR__) ); $app->singleton( Illuminate\Contracts\Http\Kernel::class, App\Http\Kernel::class );
Application类绑定基本类到容器
Kernel类执行路由分发加载控制器等操作
3.进入Kernel.php
//全局路由中间件,每次执行都会执行 protected$middleware=[]; //中间件路由分组, protected$middlewareGroups=[]; //中间件别名,可以单独使用也可以分配给组 protected$routeMiddleware=[]; //中间件排序 protected$middlewarePriority=[];
kernel类继承Illuminate\Foundation\Http\Kernel类
4.进入Illuminate\Foundation\Http\Kernel类
//http方法参数覆盖,也就是X-HTTP-METHOD-OVERRIDE中有参数,就按照这个里面的走,如果没有,那就是post $request->enableHttpMethodParameterOverride(); //通过中间件/路由器发送给定的请求。 $response=$this->sendRequestThroughRouter($request); //触发事件并呼叫听众韩注:触发观察者 $this->app['events']->dispatch( newEvents\RequestHandled($request,$response) ); return$response;
进入sendRequestThroughRouter方法
//注册请求类到容器中 $this->app->instance('request',$request); //从facade根实例中删除共享实例 Facade::clearResolvedInstance('request'); //启动引导类protected$bootstrappers=[];引导类都在这个数组中 $this->bootstrap(); //通过管道模式执行最终结果,切面编程,aop return(newPipeline($this->app)) //设置通过管道发送的对象 ->send($request) //设置管道阵列。 //shouldSkipMiddleware判断是否应该跳过中间件,$this->make('middleware.disable')设置为true //$this->bound('middleware.disable')设置为true应该可以跳过所有中间件,不知道这么做的好处是什么? ->through($this->app->shouldSkipMiddleware()?[]:$this->middleware) //使用最终目标回调运行管道,最终需要运行的结果 ->then($this->dispatchToRouter());
进入dispatchToRouter路由分发,最终由路由类中dispatch执行路由,并实现注入
$this->router->dispatch($request);
利用反射原理实现依赖注入Illuminate\Container\Container类中
publicfunctionmake($abstract,array$parameters=[]){ return$this->resolve($abstract,$parameters); } publicfunctionbuild($concrete) //build中 $reflector=newReflectionClass($concrete);
依赖注入通过$parameter->getClass()知道是什么类
classDemo{ publicfunctionstore(Request$req333,$abc){ } } classRequest{} $method=newReflectionMethod('Demo','store'); foreach($method->getParameters()as$parameter){ //获取参数的限制类的类型 $param_type=$param->getClass();//获取当前注入对象的类型提示 $param_value=$param->getName();//获取参数名称 if($param_type){ //通过类的类型限制名称中提取容器中的实例 $avgs[]=$app[$param_type->name]; } } $reflect->invokeArgs($app['demo'],$avgs);
X-HTTP-METHOD-OVERRIDE可以覆盖laravel的请求,比如实现restful请求,像putdelete等特殊的请求
更多关于Laravel相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。