vendor/codeages/biz-framework/src/Context/Biz.php line 191

Open in your IDE?
  1. <?php
  2. namespace Codeages\Biz\Framework\Context;
  3. use Codeages\Biz\Framework\Cache\CacheManager;
  4. use Codeages\Biz\Framework\Dao\Annotation\MetadataReader;
  5. use Codeages\Biz\Framework\Dao\ArrayStorage;
  6. use Codeages\Biz\Framework\Dao\CacheStrategy;
  7. use Codeages\Biz\Framework\Dao\DaoProxy;
  8. use Codeages\Biz\Framework\Dao\FieldSerializer;
  9. use Codeages\Biz\Framework\Dao\RedisCache;
  10. use Codeages\Biz\Framework\Service\ServiceProxy;
  11. use Pimple\Container;
  12. use Pimple\ServiceProviderInterface;
  13. use Symfony\Component\EventDispatcher\EventDispatcher;
  14. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  15. class Biz extends Container
  16. {
  17.     protected $providers = [];
  18.     protected $booted false;
  19.     public function __construct(array $values = [])
  20.     {
  21.         parent::__construct();
  22.         $biz $this;
  23.         $biz['debug'] = false;
  24.         $biz['logger'] = null;
  25.         $biz['interceptors'] = new \ArrayObject();
  26.         $biz['migration.directories'] = new \ArrayObject();
  27.         $biz['console.commands'] = new \ArrayObject();
  28.         $biz['console.commands'][] = function () {
  29.             return new \Codeages\Biz\Framework\Command\EnvWriteCommand();
  30.         };
  31.         $biz['autoload.aliases'] = new \ArrayObject(['' => 'Biz']);
  32.         $biz['dispatcher'] = function () {
  33.             return new EventDispatcher();
  34.         };
  35.         $biz['callback_resolver'] = function ($biz) {
  36.             return new CallbackResolver($biz);
  37.         };
  38.         $biz['autoloader'] = function ($biz) {
  39.             return new ContainerAutoloader(
  40.                 $biz,
  41.                 $biz['autoload.aliases'],
  42.                 [
  43.                     'service' => $biz['autoload.object_maker.service'],
  44.                     'dao' => $biz['autoload.object_maker.dao'],
  45.                 ]
  46.             );
  47.         };
  48.         $biz['autoload.object_maker.service'] = function ($biz) {
  49.             return function ($namespace$name) use ($biz) {
  50.                 $className "{$namespace}\\Service\\Impl\\{$name}Impl";
  51.                 if (!empty($biz['service_proxy_enabled'])) {
  52.                     return new ServiceProxy($biz$className);
  53.                 }
  54.                 return new $className($biz);
  55.             };
  56.         };
  57.         $biz['autoload.object_maker.dao'] = function ($biz) {
  58.             return function ($namespace$name) use ($biz) {
  59.                 $class "{$namespace}\\Dao\\Impl\\{$name}Impl";
  60.                 return new DaoProxy($biz, new $class($biz), $biz['dao.metadata_reader'], $biz['dao.serializer'], $biz['dao.cache.array_storage']);
  61.             };
  62.         };
  63.         $biz['array_storage'] = function () {
  64.             return new ArrayStorage();
  65.         };
  66.         $biz['dao.metadata_reader'] = function ($biz) {
  67.             if ($biz['debug']) {
  68.                 $cacheDirectory null;
  69.             } else {
  70.                 $cacheDirectory $biz['cache_directory'].DIRECTORY_SEPARATOR.'dao_metadata';
  71.             }
  72.             return new MetadataReader($cacheDirectory);
  73.         };
  74.         $biz['dao.serializer'] = function () {
  75.             return new FieldSerializer();
  76.         };
  77.         $biz['dao.cache.redis_wrapper'] = function ($biz) {
  78.             return new RedisCache($biz['redis'], $biz['dispatcher']);
  79.         };
  80.         $biz['dao.cache.array_storage'] = null;
  81.         $biz['dao.cache.enabled'] = false;
  82.         $biz['dao.cache.strategy.default'] = function ($biz) {
  83.             return $biz['dao.cache.strategy.table'];
  84.         };
  85.         $biz['dao.cache.strategy.table'] = function ($biz) {
  86.             return new CacheStrategy\TableStrategy($biz['dao.cache.redis_wrapper'], $biz['dao.cache.array_storage']);
  87.         };
  88.         $biz['dao.cache.strategy.row'] = function ($biz) {
  89.             return new CacheStrategy\RowStrategy($biz['dao.cache.redis_wrapper'], $biz['dao.metadata_reader']);
  90.         };
  91.         $biz['lock.flock.directory'] = function ($biz) {
  92.             return $biz['run_dir'];
  93.         };
  94.         $biz['lock.store'] = function ($biz) {
  95.             return new \Symfony\Component\Lock\Store\FlockStore($biz['lock.flock.directory']);
  96.         };
  97.         $biz['lock.factory'] = function ($biz) {
  98.             return new \Symfony\Component\Lock\LockFactory($biz['lock.store']);
  99.         };
  100.         $biz['cache.enabled'] = true;
  101.         $biz['cache.default_ttl'] = 3600 2// 2 小时
  102.         $biz['cache'] = function ($biz) {
  103.             if (isset($biz['redis'])) {
  104.                 return new CacheManager($biz['redis'], [
  105.                     'enabled' => $biz['cache.enabled'],
  106.                     'ttl' => $biz['cache.default_ttl'],
  107.                 ]);
  108.             } else {
  109.                 return new CacheManager(null, ['enabled' => false]);
  110.             }
  111.         };
  112.         foreach ($values as $key => $value) {
  113.             $this->offsetSet($key$value);
  114.         }
  115.     }
  116.     public function register(ServiceProviderInterface $provider, array $values = [])
  117.     {
  118.         $this->providers[] = $provider;
  119.         parent::register($provider$values);
  120.         return $this;
  121.     }
  122.     public function boot()
  123.     {
  124.         if (true === $this->booted) {
  125.             return;
  126.         }
  127.         foreach ($this->providers as $provider) {
  128.             if ($provider instanceof EventListenerProviderInterface) {
  129.                 $provider->subscribe($this$this['dispatcher']);
  130.             }
  131.             if ($provider instanceof BootableProviderInterface) {
  132.                 $provider->boot($this);
  133.             }
  134.         }
  135.         $this->booted true;
  136.     }
  137.     public function on($eventName$callback$priority 0)
  138.     {
  139.         if ($this->booted) {
  140.             $this['dispatcher']->addListener($eventName$this['callback_resolver']->resolveCallback($callback), $priority);
  141.             return;
  142.         }
  143.         $this->extend('dispatcher', function (EventDispatcherInterface $dispatcher$app) use ($callback$priority$eventName) {
  144.             $dispatcher->addListener($eventName$app['callback_resolver']->resolveCallback($callback), $priority);
  145.             return $dispatcher;
  146.         });
  147.     }
  148.     public function service($alias)
  149.     {
  150.         return $this['autoloader']->autoload('service'$alias);
  151.     }
  152.     public function dao($alias)
  153.     {
  154.         return $this['autoloader']->autoload('dao'$alias);
  155.     }
  156. }