Intereting Posts
PHP strtotime: Получить предыдущий месяц Не удается получить доступ к файлам php, скопированным в / var / www / или другие папки Как я могу вернуть представление из вызова ajax в Laravel 5 Ошибка codeigniter csrf при отправке формы Doctrine querybuilder DATE_FORMAT не работает Потоковая передача mp4 через php-файл постепенно Массив объединяется в ассоциативный массив Как предоставить печать на принтер в PHP-Gtk? Пользовательский фильтр в сетке кендо, передающий нулевые значения, когда фильтрация сбоку usere serevr Загрузите видеофайлы с помощью PHP и сохраните их в соответствующей папке и введите запись в базу данных Как установить путь PHP include через .htaccess? Как оптимизировать время выполнения при вставке данных с помощью pdo? Как вставить несколько данных, используя отношение? PHP взрывает массив, затем перебирает значения и выводит переменную Уточнение часового пояса PHP / MySQL

Symfony 2.0 получает сервис внутри объекта

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://symfony.com/doc/current/book/security.html

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

У доктринных объектов есть события жизненного цикла, которые можно подключить к прослушивателю событий, см. 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); } } }