Dans le contrôleur, je pourrais faire
$this->get('service.name')
Mais dans une classe personnalisée, comment puis-je faire cela ?
Dans le contrôleur, je pourrais faire
$this->get('service.name')
Mais dans une classe personnalisée, comment puis-je faire cela ?
Définissez votre classe personnalisée comme un service, puis injectez-y des dépendances.
Ex :
// services.yml
services:
my.custom.service.id:
class: My\Custom\Class
arguments:
- @service.name
- @doctrine.orm.entity_manager
Le constructeur de votre classe personnalisée recevra alors ces services comme arguments.
N'oubliez pas de lire la documentation officielle sur le conteneur de service. Elle traite de tout cela en détail.
Vous étiez sur la bonne voie avec ContainerAware.
$this->get('id')
est en fait un raccourci vers $this->container->get('id')
. Pour intégrer un conteneur dans votre classe, il suffit d'implémenter ContainerAwareInterface
- en insérant cet extrait dans votre classe :
public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null)
{
$this->container = $container;
}
Si vous ne connaissez pas la liste complète des dépendances dont vous avez besoin au moment où le service est créé, vous pouvez passer le conteneur comme argument http://symfony.com/doc/current/book/service_container.html#using-the-expression-language
services:
service_name:
class: AppBundle\Class
arguments: ['@=container']
Ce n'est pas la meilleure pratique, mais cela fonctionne. Si votre classe personnalisée n'est pas définie comme un service, vous pouvez accéder au conteneur de service en utilisant la variable globale $kernel :
class Helper {
private $container;
/**
* Constructor assigns service container to private container.
*/
public function __construct() {
global $kernel;
$this->container = $kernel->getContainer();
}
function doSOmething() {
$someService = $this->container->get('service.name');
// do something with someService ...
}
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.