Как получить доступ к методам репозитория для сущности в 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 и вы готовы.
