2

Symfony 2 で ACL を使用し、それらをフィクスチャにロードしたいと考えています。

次のコードは完全に機能しますが、コメントarray('myprivateroom', 'user1', 'view'),を外すと次のエラーが発生します。

[Symfony\Component\Security\Acl\Exception\AclAlreadyExistsException]  ObjectIdentity(1, Acme\RoomBundle\Entity\Room) is already associated with an ACL.

問題はここにあると思います$acl = $aclProvider-createAcl(ObjectIdentity::fromDomainObject($room));が、解決方法がわかりません。

public function load(ObjectManager $manager)
{
    $datas = array(
        array('myprivateroom', 'admin', 'owner'),
        //array('myprivateroom', 'user1', 'view'),
        array('mypublicroom', 'user1', 'owner'),
    );

    foreach ($datas as $data) {
        // creating the ACL
        $room = $this->getReference($data[0]);
        $aclProvider = $this->container->get('security.acl.provider');
        $objectIdentity = ObjectIdentity::fromDomainObject($room);
        //problem here when I uncomment array('myprivateroom', 'user1', 'view'),
        $acl = $aclProvider->createAcl(ObjectIdentity::fromDomainObject($room));

        // retrieving the security identity of the user
        $user = $this->getReference($data[1]);
        $securityIdentity = UserSecurityIdentity::fromAccount($user);

        //create mask
        $builder = new MaskBuilder();
        $builder->add($data[2]);
        $mask = $builder->get();

        // grant owner access
        $acl->insertObjectAce($securityIdentity, $mask);
        $aclProvider->updateAcl($acl);
    }
}

ありがとう

更新:次のような2つの配列を行う場合

$datas = array(
    array('myprivateroom', 'admin', 'owner'),
    array('mypublicroom', 'user1', 'owner'),
);

$datas2 = array(
    array('myprivateroom', 'user1', 'view'),
);

そして2つ目のforeachですが、2つ目は に置き換えます。完全に機能$acl = $aclProvider->createAcl(ObjectIdentity::fromDomainObject($room));$acl = $aclProvider->findAcl($objectIdentity);ますが、正しい方法ではないと思います。次は機能しません。

try {
    $acl = $aclProvider->findAcl($objectIdentity);
} catch (AclNotFoundException $e) {
    $acl = $aclProvider->createAcl($objectIdentity);
}
4

2 に答える 2