Imを説得し、答えを見つけることができません。アプリケーションにデータベースロールモデルがあります。ユーザーはロールを持つことができますが、このロールはデータベースに保存する必要があります。
ただし、ユーザーはデータベースからデフォルトの役割を追加する必要があります。だから私はサービスを作成しました:
<?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%]
そして今、私はそれをUserController
とUser
エンティティの2つの場所で使用したいと思います。エンティティ内でそれらを取得するにはどうすればよいですか?コントローラについては、私はちょうどする必要があると思う:
$this->get('alef.role_service');
しかし、エンティティ内でサービスを取得する方法は?
あなたはしません。これは非常によくある質問です。エンティティは、他のエンティティのみを知っている必要があり、エンティティマネージャまたは他の高レベルサービスについては知ってはいけません。この開発方法への移行を行うのは少し難しいかもしれませんが、通常は価値があります。
あなたがしたいことは、ユーザーをロードするときにロールをロードすることです。通常、この種のことを行うUserProviderになります。セキュリティに関するセクションを読みましたか?それが出発点になるはずです。
エンティティにサービスを提供することは非常に推奨されていませんが、isグローバルカーネルをいじる必要のない素敵な方法があります。
Doctrineエンティティには、イベントリスナーをフックできるlifeCycleイベントがあります。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events この例では、postLoadを使用します。これは、エンティティの作成後すぐにトリガーされます。
EventListenersは、他のサービスを注入するサービスとして作成できます。
App/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);
}
}
}