Kategorien
CMS Systeme Frameworks PHP Sonata Symfony2

Symfony Sonata ACL – neue Einträge die nicht im Sonata erzeugt werden haben keine Rechte

Um in Symfony Sonata die ACL auch mit Einträgen zu nutzen, die durch ein Frontend oder im Hintergrund erzeugt werden, ohne den Sonatakontext, muss man den ACL Eintrag selbst erstellen. Dazu kann man einen EntityEventListener installieren und im postPersist Event folgendes tun:

    public function postPersist(LifecycleEventArgs $args)
    {
        $this->addAcl($args);
    }

    protected function addAcl(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        $adminSecurityHandler = $this->container->get('sonata.admin.security.handler');

        $adminPool  = $this->container->get('sonata.admin.pool');
        $admin      = $adminPool->getAdminByClass(get_class($entity));

        if (null !== $admin) {
            $objectIdentity = ObjectIdentity::fromDomainObject($entity);
            $acl = $adminSecurityHandler->getObjectAcl($objectIdentity);
            if (is_null($acl)) {
                $acl = $adminSecurityHandler->createAcl($objectIdentity);
            }
            $adminSecurityHandler->addObjectClassAces($acl, $adminSecurityHandler->buildSecurityInformation($admin));
            $adminSecurityHandler->updateAcl($acl);
        }
    }