自定义注册服务

默认HunterPHP支持简单的类的依赖注入,但是有时我们会遇到一些需要传参,或者复杂初始化的类,比如Flysystem这样的库,需要初始化时传入缓存路径,所以就不能像普通的类那些直接依赖注入使用,但是,超叼的我马上实现了HunterPHP的服务注册机制,很简单,你先只需在xxx.services.yml服务文件里加上类似如下的代码:

providers:
  flysystem.filesystems_service:
    class: Hunter\flysystem\ServiceProvider\FlysystemServiceProvider

其中,providers是关键字,表示定义一个服务注册,这里还支持另一种关键字:services, 具体请看默认安装包里的test模块,它是用来定义一个插件的。

然后,第二步,就是实现providers里定义的那个类FlysystemServiceProvider , 存放路径是模块目录下的src/ServiceProvider/ :

<?php

namespace Hunter\flysystem\ServiceProvider;

use League\Container\ServiceProvider\AbstractServiceProvider;
use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local;
use League\Flysystem\Cached\CachedAdapter;
use League\Flysystem\Cached\Storage\Memory as CacheStore;

class FlysystemServiceProvider extends AbstractServiceProvider {

    /**
     * @var array
     */
    protected $provides = ['League\Flysystem\Filesystem'];
    /**
     * @{inheritDoc}
     */
    public function register()
    {
        $cache_dir = $GLOBALS['cache_dir'];
        $this->getContainer()->share('League\Flysystem\Filesystem', function () use ($cache_dir) {
          // Create the adapter
          $localAdapter = new Local($cache_dir);

          // Create the cache store
          $cacheStore = new CacheStore();

          // Decorate the adapter
          $adapter = new CachedAdapter($localAdapter, $cacheStore);

          // And use that to create the file system
          $filesystem = new Filesystem($adapter);

          return $filesystem;
        });
    }

}

这个类主要继承了AbstractServiceProvider类, 并在register函数里注册自己的类, 注意 :

 protected $provides = ['League\Flysystem\Filesystem'];

这里要填写的是你要注册的类的命名空间, 我们这样注册以后, 就可以在你的任意Controller里像使用其他普通类一样直接依赖注入:

HunterPHP - 用心与你沟通