Im seraching и не может найти ответ. У меня есть модель ролевой модели базы данных в моем приложении. Пользователь может иметь роль, но эта роль должна быть сохранена в базе данных.
Но тогда пользователю необходимо добавить роль по умолчанию из базы данных. Поэтому я создал службу:
<?php namespace Alef\UserBundle\Service; use Alef\UserBundle\Entity\Role; /** * Description of RoleService * * @author oracle */ class RoleService { const ENTITY_NAME = 'AlefUserBundle:Role'; private $em; public function __construct(EntityManager $em) { $this->em = $em; } public function findAll() { return $this->em->getRepository(self::ENTITY_NAME)->findAll(); } public function create(User $user) { // possibly validation here $this->em->persist($user); $this->em->flush($user); } public function addRole($name, $role) { if (($newrole = findRoleByRole($role)) != null) return $newrole; if (($newrole = findRoleByName($name)) != null) return $newrole; //there is no existing role $newrole = new Role(); $newrole->setName($name); $newrole->setRole($role); $em->persist($newrole); $em->flush(); return $newrole; } public function getRoleByName($name) { return $this->em->getRepository(self::ENTITY_NAME)->findBy(array('name' => $name)); } public function getRoleByRole($role) { return $this->em->getRepository(self::ENTITY_NAME)->findBy(array('role' => $role)); } }
my services.yml
:
alef.role_service: class: Alef\UserBundle\Service\RoleService arguments: [%doctrine.orm.entity_manager%]
И теперь я хочу использовать его в двух местах: UserController
и User
entity. Как я могу получить их внутри сущности? Что касается контроллера, я думаю, мне просто нужно:
$this->get('alef.role_service');
Но как получить сервис внутри объекта?
Вы этого не сделаете. Это очень распространенный вопрос. Сущности должны знать только о других объектах, а не о менеджере сущности или других службах высокого уровня. Это может быть проблемой для перехода на этот способ развития, но это обычно стоит того.
Что вы хотите сделать, так это загрузить эту роль при загрузке пользователя. Как правило, у вас будет UserProvider, который делает такие вещи. Прочитали ли вы разделы по безопасности? Это должно быть вашей отправной точкой:
Хотя очень сложно получать услуги в сущности, есть хороший способ сделать это, что не связано с беспорядочным взаимодействием с глобальным ядром.
У доктринных объектов есть события жизненного цикла, которые можно подключить к прослушивателю событий, см. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events. Ради в примере я буду использовать postLoad, который запускается вскоре после создания Entity.
EventListeners могут быть созданы как услуги, в которые вы вводите другие сервисы.
Добавить в приложение / config / config.yml:
services: example.listener: class: Alef\UserBundle\EventListener\ExampleListener arguments: - '@alef.role_service' tags: - { name: doctrine.event_listener, event: postLoad }
Добавить в свою организацию:
use Alef\UserBundle\Service\RoleService; private $roleService; public function setRoleService(RoleService $roleService) { $this->roleService = $roleService; }
И добавьте новый EventListener:
namespace Alef\UserBundle\EventListener; use Doctrine\ORM\Event\LifecycleEventArgs; use Alef\UserBundle\Service\RoleService; class ExampleListener { private $roleService; public function __construct(RoleService $roleService) { $this->roleService = $roleService; } public function postLoad(LifecycleEventArgs $args) { $entity = $args->getEntity(); if(method_exists($entity, 'setRoleService')) { $entity->setRoleService($this->roleService); } } }