| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- <?php declare(strict_types=1);
- namespace Automattic\WooCommerce\Vendor\League\Container;
- use Automattic\WooCommerce\Vendor\League\Container\Definition\{DefinitionAggregate, DefinitionInterface, DefinitionAggregateInterface};
- use Automattic\WooCommerce\Vendor\League\Container\Exception\{NotFoundException, ContainerException};
- use Automattic\WooCommerce\Vendor\League\Container\Inflector\{InflectorAggregate, InflectorInterface, InflectorAggregateInterface};
- use Automattic\WooCommerce\Vendor\League\Container\ServiceProvider\{
- ServiceProviderAggregate,
- ServiceProviderAggregateInterface,
- ServiceProviderInterface
- };
- use Psr\Container\ContainerInterface;
- class Container implements ContainerInterface
- {
- /**
- * @var boolean
- */
- protected $defaultToShared = false;
- /**
- * @var DefinitionAggregateInterface
- */
- protected $definitions;
- /**
- * @var ServiceProviderAggregateInterface
- */
- protected $providers;
- /**
- * @var InflectorAggregateInterface
- */
- protected $inflectors;
- /**
- * @var ContainerInterface[]
- */
- protected $delegates = [];
- /**
- * Construct.
- *
- * @param DefinitionAggregateInterface|null $definitions
- * @param ServiceProviderAggregateInterface|null $providers
- * @param InflectorAggregateInterface|null $inflectors
- */
- public function __construct(
- DefinitionAggregateInterface $definitions = null,
- ServiceProviderAggregateInterface $providers = null,
- InflectorAggregateInterface $inflectors = null
- ) {
- $this->definitions = $definitions ?? new DefinitionAggregate;
- $this->providers = $providers ?? new ServiceProviderAggregate;
- $this->inflectors = $inflectors ?? new InflectorAggregate;
- if ($this->definitions instanceof ContainerAwareInterface) {
- $this->definitions->setLeagueContainer($this);
- }
- if ($this->providers instanceof ContainerAwareInterface) {
- $this->providers->setLeagueContainer($this);
- }
- if ($this->inflectors instanceof ContainerAwareInterface) {
- $this->inflectors->setLeagueContainer($this);
- }
- }
- /**
- * Add an item to the container.
- *
- * @param string $id
- * @param mixed $concrete
- * @param boolean $shared
- *
- * @return DefinitionInterface
- */
- public function add(string $id, $concrete = null, bool $shared = null) : DefinitionInterface
- {
- $concrete = $concrete ?? $id;
- $shared = $shared ?? $this->defaultToShared;
- return $this->definitions->add($id, $concrete, $shared);
- }
- /**
- * Proxy to add with shared as true.
- *
- * @param string $id
- * @param mixed $concrete
- *
- * @return DefinitionInterface
- */
- public function share(string $id, $concrete = null) : DefinitionInterface
- {
- return $this->add($id, $concrete, true);
- }
- /**
- * Whether the container should default to defining shared definitions.
- *
- * @param boolean $shared
- *
- * @return self
- */
- public function defaultToShared(bool $shared = true) : ContainerInterface
- {
- $this->defaultToShared = $shared;
- return $this;
- }
- /**
- * Get a definition to extend.
- *
- * @param string $id [description]
- *
- * @return DefinitionInterface
- */
- public function extend(string $id) : DefinitionInterface
- {
- if ($this->providers->provides($id)) {
- $this->providers->register($id);
- }
- if ($this->definitions->has($id)) {
- return $this->definitions->getDefinition($id);
- }
- throw new NotFoundException(
- sprintf('Unable to extend alias (%s) as it is not being managed as a definition', $id)
- );
- }
- /**
- * Add a service provider.
- *
- * @param ServiceProviderInterface|string $provider
- *
- * @return self
- */
- public function addServiceProvider($provider) : self
- {
- $this->providers->add($provider);
- return $this;
- }
- /**
- * {@inheritdoc}
- */
- public function get($id, bool $new = false)
- {
- if ($this->definitions->has($id)) {
- $resolved = $this->definitions->resolve($id, $new);
- return $this->inflectors->inflect($resolved);
- }
- if ($this->definitions->hasTag($id)) {
- $arrayOf = $this->definitions->resolveTagged($id, $new);
- array_walk($arrayOf, function (&$resolved) {
- $resolved = $this->inflectors->inflect($resolved);
- });
- return $arrayOf;
- }
- if ($this->providers->provides($id)) {
- $this->providers->register($id);
- if (!$this->definitions->has($id) && !$this->definitions->hasTag($id)) {
- throw new ContainerException(sprintf('Service provider lied about providing (%s) service', $id));
- }
- return $this->get($id, $new);
- }
- foreach ($this->delegates as $delegate) {
- if ($delegate->has($id)) {
- $resolved = $delegate->get($id);
- return $this->inflectors->inflect($resolved);
- }
- }
- throw new NotFoundException(sprintf('Alias (%s) is not being managed by the container or delegates', $id));
- }
- /**
- * {@inheritdoc}
- */
- public function has($id) : bool
- {
- if ($this->definitions->has($id)) {
- return true;
- }
- if ($this->definitions->hasTag($id)) {
- return true;
- }
- if ($this->providers->provides($id)) {
- return true;
- }
- foreach ($this->delegates as $delegate) {
- if ($delegate->has($id)) {
- return true;
- }
- }
- return false;
- }
- /**
- * Allows for manipulation of specific types on resolution.
- *
- * @param string $type
- * @param callable|null $callback
- *
- * @return InflectorInterface
- */
- public function inflector(string $type, callable $callback = null) : InflectorInterface
- {
- return $this->inflectors->add($type, $callback);
- }
- /**
- * Delegate a backup container to be checked for services if it
- * cannot be resolved via this container.
- *
- * @param ContainerInterface $container
- *
- * @return self
- */
- public function delegate(ContainerInterface $container) : self
- {
- $this->delegates[] = $container;
- if ($container instanceof ContainerAwareInterface) {
- $container->setLeagueContainer($this);
- }
- return $this;
- }
- }
|