服务提供者

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的使用, 更深入了解两种类型的区别。

results matching ""

    No results matching ""