How to access repository methods for an entity in symfony2? How to access repository methods for an entity in symfony2? symfony symfony

How to access repository methods for an entity in symfony2?


Everything is possible however you should not access the entity's repository from the entity itself because of the separation of concerns.

See this Stackoverflow answer for more details.

Basically, the whole idea is that you want to have your application organized the following way.

In short:

Controller > Repository > Entities.

It should not go in the other direction otherwise it creates a mess.

If you want to go a bit further into the separation of concerns you could do the following.

Controller > Service > Repository > Entities

Alternative solutions:

  • Create a Twig extension that access a service (which access a repository) or a repository.
  • Create a method in your repository, call the method in your controller, map the data to IDs (keys of array are the IDs), pass the array to the template and then pull the data from the array using the entity IDs
  • Create a method in your repository, call the method in your controller, inject the data into your entities and access the data through the entity in your template.

There are probably others but you would know better how your application is organized.


If the bundle is Acme/DemoBundle, then one would expect at a minimum

User entity

namespace Acme/DemoBundle/Entityuse Doctrine\ORM\Mapping as ORM;/** * * @ORM\Table(name="user") * @ORM\Entity(repositoryClass="Acme/DemoBundle/Entity/UserRepository") */class User {...}

User repository

namespace Acme/DemoBundle/Entityuse Doctrine\ORM\Mapping as ORM;class UserRepository extends EntityRepository{...}   

It is also true that with an array of ids, one can also do the following in a controller:

...$em = $this->getDoctrine()->getManager();$users = $em->getRepository("AcmeDemoBundle:User")->findAllById($idArray);...

To iterate thru users in a controller, one can then use a foreach loop as in:

foreach ($users as $user) {//each user is an array...$id = $user['id'];...}

or in a template:

{% for user in users %}...{{ user.firstName }}...{% endfor %}


You need to declare the UserRepository as an EntityRepository for your user entity. In your User entity add this annotation:

/** * @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\UserRepository") */

See the docs for a more detailed description.