Symfony的2.0进入内部实体服务(Symfony 2.0 getting service in

2019-06-23 23:36发布

林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));
    }

}

services.yml是:

alef.role_service:
    class: Alef\UserBundle\Service\RoleService
    arguments: [%doctrine.orm.entity_manager%]

现在我想用它在两个地方: UserControllerUser实体。 我怎样才能让他们内部的实体? 至于控制器我想我只需要:

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

可是如何才能让里面的实体服务?

Answer 1:

你不知道。 这是一个非常普遍的问题。 实体应该只知道其他实体而不是有关实体的经理或其他高级服务。 它可以是一个有点过渡到发展的这样一个挑战,但它通常是值得的。

什么,你想要做的是当你加载用户加载的作用。 通常你会最终有一个UserProvider该做这样的事情。 你必须通过安全的章节读? 这应该是你的出发点:

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



Answer 2:

虽然这是很沮丧让服务变成实体, 一个很好的办法做到这一点不涉及与全局内核搞乱。

主义实体具有生命周期事件,你可以连接一个事件侦听器,看到http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events为求本例中,我将使用负荷后,创建实体之后不久触发。

事件侦听器可以制成为你注入其他服务为服务。

加入APP /配置/ 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;
 }

并添加新的事件监听:

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);
         }
     }
}


文章来源: Symfony 2.0 getting service inside entity