Подтвердить что ты не робот

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. Как я могу получить их внутри сущности? Что касается контроллера, я думаю, мне просто нужно:

$this->get('alef.role_service');

Но как получить сервис внутри объекта?

4b9b3361

Ответ 1

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

Что вы хотите сделать, так это загрузить эту роль при загрузке пользователя. Как правило, у вас будет UserProvider, который делает такие вещи. Прочитали ли вы разделы по безопасности? Это должно быть вашей отправной точкой:

http://symfony.com/doc/current/book/security.html

Ответ 2

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

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