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