服务提供者
Laravel是基于IOC容器建立的, 所以服务提供者随处可见。一般来说, 在Laravel中, 服务提供者会做两个事情:register和boot。register往容器里注册对象, boot在系统初始化的时候做一些事情。在Laravel中这些被统一称作ServiceProvider。
而在Stone中,Service Provider被分成两种类型: Boot Service Provider 和 Request Service Provider。主要原因是, Service Provider只会在app初始化的时候执行, 使用Stone后,多次请求只会执行一次, 对于某些Service Provider会存在问题。
所以被拆开为:
- Boot Service Provider, 仅在进程初始化时执行一次
- Request Service Provider, 每次请求都会执行
如何定义服务提供者
Stone设计一直有个原则, 100%兼容原有PHP-FPM体系。 所以, 定义在config/app.php中的providers,默认都会是boot类型的。
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
Qufenqi\Stone\StoneServiceProvider::class,
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
除非你在app/stone.php里重新定义为request类型:
'web' => [
'user' => 'apple', // run user
'group' => 'apple', // run group
'domain' => '/var/run/stone-web-fpm.sock',
'request-providers' => [
Illuminate\Cookie\CookieServiceProvider::class,
],
],
这样的目的还是为了PHP-FPM, 原来的providers不需要做修改, 这样使用PHP-FPM时不会有任何问题。
例子:安装debugbar
通过对debugbar的使用, 更深入了解两种类型的区别。