73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Yoast\WP\Lib\Dependency_Injection;
 | 
						|
 | 
						|
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;
 | 
						|
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
 | 
						|
 | 
						|
/**
 | 
						|
 * Container_Registry class.
 | 
						|
 */
 | 
						|
class Container_Registry {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * The registered containers.
 | 
						|
	 *
 | 
						|
	 * @var ContainerInterface[]
 | 
						|
	 */
 | 
						|
	private static $containers = [];
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Register a container.
 | 
						|
	 *
 | 
						|
	 * @param string             $name      The name of the container.
 | 
						|
	 * @param ContainerInterface $container The container.
 | 
						|
	 *
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public static function register( $name, ContainerInterface $container ) {
 | 
						|
		self::$containers[ $name ] = $container;
 | 
						|
	}
 | 
						|
 | 
						|
    // phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- PHPCS doesn't take into account exceptions thrown in called methods.
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get an instance from a specific container.
 | 
						|
	 *
 | 
						|
	 * @param string $name              The name of the container.
 | 
						|
	 * @param string $id                The ID of the service.
 | 
						|
	 * @param int    $invalid_behaviour The behaviour when the service could not be found.
 | 
						|
	 *
 | 
						|
	 * @return object|null The service.
 | 
						|
	 *
 | 
						|
	 * @throws ServiceCircularReferenceException When a circular reference is detected.
 | 
						|
	 * @throws ServiceNotFoundException          When the service is not defined.
 | 
						|
	 */
 | 
						|
	public static function get( $name, $id, $invalid_behaviour = 1 ) {
 | 
						|
		if ( ! \array_key_exists( $name, self::$containers ) ) {
 | 
						|
			if ( $invalid_behaviour === ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE ) {
 | 
						|
				throw new ServiceNotFoundException( $id );
 | 
						|
			}
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
		return self::$containers[ $name ]->get( $id, $invalid_behaviour );
 | 
						|
	}
 | 
						|
 | 
						|
    // phpcs:enable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Attempts to find a given service ID in all registered containers.
 | 
						|
	 *
 | 
						|
	 * @param string $id The service ID.
 | 
						|
	 *
 | 
						|
	 * @return string|null The name of the container if the service was found.
 | 
						|
	 */
 | 
						|
	public static function find( $id ) {
 | 
						|
		foreach ( self::$containers as $name => $container ) {
 | 
						|
			if ( $container->has( $id ) ) {
 | 
						|
				return $name;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |