Как получить доступ к методам репозитория для сущности в symfony2?

Я застрял с проблемой, пожалуйста, помогите мне с этим. Вот scenarario:

у меня есть сущность " Пользователь "и соответствующий репозиторий" UserRepository", внутри моей сущности есть только методы getter и setter. Все пользовательские запросы, которые я написал UserRepository. Теперь внутри моего UserController я пытаюсь получить доступ к методам репозитория,которые я не могу сделать. например. Пользователь сущность:

class User
{
    ...

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        return $this->id=$id;
    }
    public function setProperty($property)
    {
        $this->property = $property;
    }


    public function getProperty()
    {
        return $this->property;
    }

    ....

    }
  ?>

UserRepository:

class UserRepository extends EntityRepository
{


    public function findUsersListingById($id)
    {
        $queryBuilder = $this->getEntityManager()->createQueryBuilder();

       $query = $em->createQuery(
                    "SELECT U
                    FROM  UserEntityPathGoesHere
                    WHERE U.id IN (".implode(",", $id).")"
                );

        $users = $query->getResult();

        return $users;
    }

    public function sayHelloWorld(){

        echo ' Hello World';
    }

}
?>

UserController

class UserController
{
 ...


$users=$this->getDoctrine()
        ->getRepository('MyUserEntityPath')
        ->findUsersListingById($ids);

    //now I have multiple users I want to iterate through each user for associating additional data with each user

     foreach($users as $user)
     {
        $temp = array();

        //I am able to access getId method which is  defined in User entity
        $temp['id'] = $user->getId();

        //however I am not able to  access method from UserRepository, I tried something like below which gives me error  call to undefined function sayHelloWorld
        $temp['status'] = $user->sayHelloWorld();

       ....

     }


}

....

как получить доступ к методам репозитория для сущности? Возможно ли это ? Если нет, то каковы альтернативы этому решению?

4 ответов


все возможно вы не должны обращаться к репозиторию сущности из самой сущности из-за разделения проблем.

посмотреть этот Stackoverflow ответ для более подробной информации.

в принципе, вся идея заключается в том, что вы хотите, чтобы ваше приложение организовано следующим образом.

короче:

контроллер > хранилище > объекты.

Это не следует идти в другом направлении, иначе это создаст беспорядок.

Если вы хотите пойти немного дальше в разделение проблем, вы можете сделать следующее.

контроллер > сервис > хранилище > объекты

альтернативные решения:

  • создать расширение Twig доступ к службе (которая обращается к репозиторию) или репозиторию.
  • создать метод в вашем репозитории вызовите метод в контроллере, сопоставьте данные с идентификаторами (ключами массива являются идентификаторы), передайте массив шаблону, а затем извлеките данные из массива с помощью идентификаторов сущности
  • создайте метод в репозитории, вызовите метод в контроллере, введите данные в объекты и получите доступ к данным через объект в шаблоне.

есть, вероятно, другие, но вы бы лучше знали, как ваше приложение организованный.


вам нужно объявить UserRepository как EntityRepository для организации-пользователя. В User сущность добавить эту аннотацию:

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

посмотреть документы для более подробного описания.


если пакет Acme / DemoBundle, то можно было бы ожидать как минимум

пользователь объекта

namespace Acme/DemoBundle/Entity

use Doctrine\ORM\Mapping as ORM;


/**
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="Acme/DemoBundle/Entity/UserRepository")
 */
class User 
{
...
}

репозитории пользователей

namespace Acme/DemoBundle/Entity

use Doctrine\ORM\Mapping as ORM;

class UserRepository extends EntityRepository
{
...
}   

также верно, что с массивом идентификаторов можно также сделать следующее в контроллере:

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

для итерации через пользователей в контроллере можно использовать цикл foreach, как в:

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

или в шаблоне:

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

вы можете использовать событие postLoad из doctrine и вводить все, что хотите, в сущность. Прослушиватель событий выглядит так:

    <?php
namespace AppBundle\EventListener;


use AppBundle\Entity\MyEntity;
use Doctrine\ORM\Event\LifecycleEventArgs;

/**
 * Class MyEntityListener
 */
class MyEntityListener
{

    public function postLoad(LifecycleEventArgs $eventArgs)
    {
        /** @var MyEntity $document */
        $document = $eventArgs->getEntity();
        if(!($document instanceof MyEntity)){
            return;
        }
        $document->setEntityManager($eventArgs->getEntityManager());

    }
}

и обслуживание.в формате YML:

services:
app.myentity.listener:
  class: AppBundle\EventListener\MyEntityListener
  tags:
    - { name: doctrine.event_listener, event: postLoad }

конечно, вашей сущности нужен метод setEntityManager и вы готовы.