laravel5 源码解析
autoload.php 用的是composer的autoload
这里就不做说明了
app.php 启动整个项目
首先看下Application这个类
class Application extends Container implements ApplicationContract, HttpKernelInterface
Container中方法很多,实现了ArrayAccess,主要方法都是是用于绑定对象的(利于重用)。
ApplicationContract 需要实现注册service provider。
HttpKernelInterface 就一个handle方法,接受一个Request, 返回一个Response。
registerBaseBindings()
把app对象自身绑定到instance属性数组。
registerBaseServiceProviders()
注册两个service provider, 一个是EventServiceProvider,注册一个单例Dispatcher,名字为’events’(TODO),另一个是RoutingServiceProvider(), 包含了Router, RouterGenerator, Redirector, ResponseFactory, 构造ResponseFactory接受两个参数,一个是ViewFactory,一个是Redirecer
registerCoreContainerAliases(), 把一系列key和对应的类名,接口名加入alias属性数组 'app' => ['Illuminate\Foundation\Application', 'Illuminate\Contracts\Container\Container', 'Illuminate\Contracts\Foundation\Application']
‘app’是key, 数组中的三个是别名(猜测:估计是每当用
构造完App后开始创建重要的instance
在app容器中共享一个App\Http\Kernel单例。
看一下这个类,继承了一个Illuminate\Foundation\Http\Kernel,实现了bootstrap, handle, terminate, getApplication这四个方法,可以想象,当收到request时候,流程就是前三个依次执行,非常简化。 protected $bootstrappers数组,包含了bootstrap的一系列启动项目。
他的__construct接受两个参数,一个Application,一个Router。需要再看一下$app->singleton是如何初始化他的,莫非已经包含了IoC的功能?(TODO)
这里先假设这两个参数已经被正确传入了。接着,立即把protected $routeMiddleware中的给router的middleware方法调用。middleware方法只是把key和Class名称加入到router的middleware属性数组中。
在app容器中共享一个App\Console\Kernel单例。
继承自Illuminate\Foundation\Console\Kernal。他的构造方法接受一个protected $commands属性和protected function schedule方法都是用来重写的。
在app容器中共享一个App\Exceptions\Handler单例。
继承自Illuminate\Foundation\Exceptions\Handler。他的构造方法接受一格Psr\Log\LoggerInterface。
至此,app算是构造完成。接下来就要调用他的方法了。
调用Application
kernel=kernel = app->make(‘Illuminate\Contracts\Http\Kernel’);response=response = kernel->handle( $request = Illuminate\Http\Request::capture() );$response->send();kernel?>terminate(kernel->terminate(request, $response);
这里的代码非常明确,首先make一个Kernal,之前已经将其绑定为singleton了。然后kernal handle一个request, 得到一个response, response调用send方法,最后kernal terminate。这里只是一个高纬度的概括,具体其中实现的方法,还需要进一步深入。
看到这里,我的感觉是,整个项目最重要的部分就是$app这个容器,或者说Container这个类,绑定的是什么(Closure),有哪些绑定方法,各个方法的作用是什么,make 和 build有什么区别,alias的作用是什么,等。了解了这些,对写框架会有帮助。
以上就介绍了Laravel5 源码解析 (一),包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号