Symfony2 – In Repository Klasse auf Service Container zugreifen

In Symfony2 haben Repository Klassen normalerweise keinen Zugriff auf den Service Container.
Das kann jedoch durchaus sinnvoll sein, damit man in der Repository Klasse z.B. auf Konfigurationsparameter zugreifen kann.
Um dies zu ermöglichen, kann man eine eigene Parent Klasse für die Repository Klassen implementieren, die die Klasse EntityRepository erweitert.
Die jeweilige Repository Klasse, die auf den Service Container zugreifen können soll, muss dann diese Klasse erweitern, als Service definiert und als Service geladen werden, damit das ganze funktioniert.

Die Parent Klasse:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
namespace MyNamespace\lib\Symfony;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
class ContainerAwareRepository extends EntityRepository implements ContainerAwareInterface
{
    protected $container;
    /**
     * Sets the Container.
     * @param ContainerInterface|null $container A ContainerInterface instance or null
     */
    public function setContainer(ContainerInterface $container=null)
    {
        $this->container = $container;
    }
}

Die Repository Klasse muss als Service definiert werden.
Beispiel im Yaml Format:

1
2
3
4
5
6
7
8
  myservices.nameOfRepositoryClass:
    class: MyNamespace\ExampleBundle\Entity\ExampleRepository
    factory_service: doctrine.orm.entity_manager
    factory_method:  getRepository
    arguments:
        - "ExampleNamespaceExampleBundle:ExampleEntity"
    calls:
        - [ setContainer, [ @service_container ] ]

Die Repository Klasse muss die oben definierte Parent Klasse erweitern

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
namespace MyNamespace\ExampleBundle\Entity;
 
use Doctrine\ORM\EntityRepository;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use MyNamespace\lib\Symfony\ContainerAwareRepository;
use MyNamespace\ExampleBundle\Entity\ExampleEntity;
 
class ExampleRepository extends ContainerAwareRepository
{
    public function exampleFunction()
    {
        ...
        // jetzt ist der Zugriff auf den Service Container möglich
        $this->container->getParameter('parametername')
        ...
    }
}

Dann muss die Repository im Controller als Klasse als Service geladen werden und bekommt im Konstruktor per Dependency Injection den Service Container als Parameter übergeben.
Somit kann man in der Repository Klasse auf den Service Container zugreifen.

1
$oRepository = $this->getContainer()->get('myservices.nameOfRepositoryClass');
Dieser Beitrag wurde unter Symfony2 abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Die Kommentarfunktion ist geschlossen.