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