Laravel基础运行流程

从入口文件起。在index.php入口文件中,主要引入了两个文件,一个是laravel/bootstrap/autoload.php另一个是laravel/bootstarp/app.php。
我们先说这个autoload.php文件。
这个文件正如它的名字一样,自动加载类,也就是解决命名空间下类的加载问题。它使用了一个autoload_real.php(这个文件在vendor/composer下)文件中的叫做ComposerAutoloaderInite(后面跟了许多数字,我也不知道为啥要这么做,哈哈哈)。这个类主要就是根据了几个相关的配置文件(姑且称之为配置文件吧):autoload_namespaces.php、autoload_psr4.php、autoload_classmap.php、autoload_files.php这四个文件中的信息实现自动加载。具体加载方式也很容易懂,其顺序是先在autoload_classmap.php文件中包含的命名空间找,找不到,然后根据PSR-4协议找,最后才是根据PSR-0协议找。
处理自动加载外还有就是会包含laravel/bootstrap/cache/compiled.php这个文件,当然这个文件不是框架自带的而是你自己写滴,主要用户提高你项目的性能。


再来看这个app.php文件。
这个文件先是注册了app服务容器。在注册完服务容器后立马向服务容器里绑定了三个服务(服务容器当然是用来装服务的啦)具体代码如下。

$app->singleton( Illuminate\Contracts\Http\Kernel::class, App\Http\Kernel::class ); $app->singleton( Illuminate\Contracts\Console\Kernel::class, App\Console\Kernel::class ); $app->singleton( Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class );

可以看出三个服务都是以单例形式绑定在容器中。
第一个服务正如它的名字一样是关于http的核心服务。第二个是则是控制台的核心服务,第三个是调试所用的异常处理服务。


回到入口文件index.php来,在绑定完三个服务后,立马就实例化(姑且这么叫吧,不过使用了依赖注入这种厉害的方式)了第一个服务,即http核心服务。
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

当服务容器实例化且基础服务构建完毕后,Laravel将生成请求对象。
$request = Illuminate\Http\Request::capture()

值得一提的是其实laravel的请求构建使用了Symfony框架的Request组件。
当请求也就是$request生成后将使用核心http服务去处理生成响应,也就是response。
$response = $kernel->handle( $request = Illuminate\Http\Request::capture() );

生成响应中有一系列的处理逻辑以后再仔细查看源码理解。主要是将请求经过中间件最后进行分发。
响应生成后发送响应
$response->send();

在这一步页面其实就已经能有返回效果了。
最后则是将一些可以结束的中间件结束掉。
$kernel->terminate($request, $response);

到这里Laravel大致的流程就走完了。




【Laravel基础运行流程】

    推荐阅读