Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders

AbstractInterfaceServiceProvider{}WC 8.5.0

Extends AbstractServiceProvider to register services and automatically tag them based on their implemented interfaces. By using the add_with_implements_tags and share_with_implements_tags methods, it becomes possible to retrieve all the services that implement a given interface with a single get call.

No Hooks.

Usage

$AbstractInterfaceServiceProvider = new AbstractInterfaceServiceProvider();
// use class methods

Methods

  1. protected add_with_implements_tags( string $id, $concrete = null, bool $shared = null )
  2. public provides( string $alias )
  3. protected share_with_implements_tags( string $id, $concrete = null )

Changelog

Since 8.5.0 Introduced.

AbstractInterfaceServiceProvider{} code WC 9.3.3

abstract class AbstractInterfaceServiceProvider extends AbstractServiceProvider {

	/**
	 * Determine whether this service provides the given alias.
	 *
	 * @param string $alias The alias to check.
	 *
	 * @return bool
	 */
	public function provides( string $alias ): bool {
		$provides = parent::provides( $alias );
		if ( $provides ) {
			return true;
		}

		static $implements = array();
		if ( empty( $implements ) ) {
			foreach ( $this->provides as $class ) {
				$implements_more = class_implements( $class );
				if ( $implements_more ) {
					$implements = array_merge( $implements, $implements_more );
				}
			}

			$implements = array_unique( $implements );
		}

		return array_key_exists( $alias, $implements );
	}

	/**
	 * Register a class in the container and add tags for all the interfaces it implements.
	 *
	 * This also updates the `$this->provides` property with the interfaces provided by the class, and ensures
	 * that the property doesn't contain duplicates.
	 *
	 * @param string     $id       Entry ID (typically a class or interface name).
	 * @param mixed|null $concrete Concrete entity to register under that ID, null for automatic creation.
	 * @param bool|null  $shared   Whether to register the class as shared (`get` always returns the same instance)
	 *                             or not.
	 *
	 * @return DefinitionInterface
	 */
	protected function add_with_implements_tags( string $id, $concrete = null, bool $shared = null ): DefinitionInterface {
		$definition = $this->add( $id, $concrete, $shared );
		foreach ( class_implements( $id ) as $interface ) {
			$definition->addTag( $interface );
		}

		return $definition;
	}

	/**
	 * Register a shared class in the container and add tags for all the interfaces it implements.
	 *
	 * @param string     $id       Entry ID (typically a class or interface name).
	 * @param mixed|null $concrete Concrete entity to register under that ID, null for automatic creation.
	 *
	 * @return DefinitionInterface
	 */
	protected function share_with_implements_tags( string $id, $concrete = null ): DefinitionInterface {
		return $this->add_with_implements_tags( $id, $concrete, true );
	}
}