Symfony - How to make Facade Service

A Facade Service is employed to obtain any service through a public static method, as opposed to injecting it via the constructor.

For example (facade service):

Facade::getEntityManager();

In this example, the getEntityManager method is accessed directly from the Facade, providing a simplified and centralized way to obtain the EntityManager service.

For example (injecting service):

class test { 
   public function __construct(private EntityManagerInterface $em) {}
}

In this case, the EntityManager service is injected into the constructor of the Test class. While this is a valid approach, Facade Services offer an alternative method for obtaining services.

To add creating facade possibility, first of all, need to set Service Container to Bundle boot() method.

For example:

class CoreBundle extends Bundle { 
   private static $serviceContainer; 
   public function boot() { 
      parent::boot(); 
      self::$serviceContainer = $this->container; 
   }
}

Now, we have Service Container in private static variable $serviceContainer. After that, we can get any services from this $serviceContainer variable.

For example:

public static function getFacadeService(string $serviceId) { 
   if (($service = self::$serviceContainer->get($serviceId)) !== null) { 
      return $service; 
   } 
   return null; 
}

So, now you can get any service by calling this method. For example:

CoreBundle::getFacadeService('doctrine.orm.default_entity_manager');

This code will return Entity Manager.

Utilizing this approach, you can create any facade class or add new facade methods, offering a clean and centralized way to access various services in your Symfony application.

Comments

Popular posts from this blog

CSS Как прикрепить слой (div) к краю

Idea PhpStorm - How to fix bugs with incorrect code Inspections and Autocomplete

PHP - How to show expected return array elements