Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Having a custom repository not associated to an entity in Symfony 2 / Doctrine 2?

Would be possible to have a custom repository not associated with an entity in Symfony 2 and Doctrine 2? I would like to put in it some native SQL that doesn't fit well in other repositories (it may refer to abstract or entity hierarchy).

How controller code $this->getDoctrine()->getRepositoty(/* ??? */) should be replaced?

like image 556
gremo Avatar asked Jul 10 '12 10:07

gremo


1 Answers

It's possible to have as many repositories as you wish. However, only a single repository can be linked with the entity manager.

You need to define a few services to add a custom repository.

<!-- My custom repository -->
<service id="acme.repository.my_entity" class="Acme\FQCN\MyEntityRepository" >
    <argument type="service" id="doctrine.orm.entity_manager" />
    <argument type="service" id="acme.metadata.my_entity" />
</service>

<!-- MyEntity metadata -->
<service id="acme.metadata.my_entity" class="Doctrine\ORM\Mapping\ClassMetaData">
    <argument>Acme\FQCN\MyEntity</argument>
</service>

The repository class would have to inherit from EntityRepository.

namespace Acme\FQCN;

use Doctrine\ORM\EntityRepository;

class MyEntityRepository extends EntityRepository
{
    /** 
     * If you want to inject any custom dependencies, you'd have either have to
     * add them to the construct or create setters. I'd suggest using setters
     * in which case you wouldn't need to use the constructor in this class.
     *
     * public function __construct($em, Doctrine\ORM\Mapping\ClassMetadata $class, $custom_dependency)
     * {
     *     parent::__construct($em, $class);
     * }
     *
     */
}

Unfortunately you'll not be able to retrieve it via the doctrine service. Instead, retrieve it straight from the container:

$this->get('acme.repository.my_entity');

EDIT

If you're creating a repository that shouldn't be linked to any entities, simply create a service and inject the necessary dependencies.

<!-- Repository for misc queries -->
<service id="acme.repository.misc" class="Acme\FQCN\MiscRepsitory">
    <argument type="service" id="database_connection" />
</service>

Since you're not using any of the Doctrine's ORM features in a custom repository, there's no need to extend EntityManager.

namespace Acme\FQCN;

use \Doctrine\DBAL\Connection;

class MiscRepository
{
    protected $conn;

    public function __construct(Connection $conn)
    {
        $this->conn = $conn;
    }
}
like image 180
kgilden Avatar answered Sep 28 '22 01:09

kgilden