2

以下のリスナーをサービスとして登録しました。これにより、ログインしているユーザーが保存されます。それは完全に機能します。エンティティを保存した後、user-id は createdBy と updatedBy にあります。ちょっとした問題: コマンド "php app / console doctrine: Fixtures: load" がエラー "Call to a member function getUser () on a non-object. それはちょっと理解できます。今だけ毎回無効にする必要があります別の解決策はありますか?

クラス UserListener は EventSubscriber を実装します
{
    保護された $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    パブリック関数 getSubscribeEvents()
    {
        配列を返します(
            イベント::prePersist、
            イベント::更新前
        );
    }

    パブリック関数 prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Post) {

            $user = $this->container->get('security.context')->getToken()->getUser();

            if (!is_object($user) || !$user instanceof User) {
                新しい AccessDeniedException() をスローします。
            }

            $entity->setCreatedBy($user);
            $entity->setUpdatedBy($user);
        }
    }

    /**
     * @param PreUpdateEventArgs $args
     */
    パブリック関数 preUpdate(PreUpdateEventArgs $args)
    {
        $entity = $args->getEntity();

        $em = $args->getEntityManager();

        if ($entity instanceof Post) {

            $user = $this->container->get('security.context')->getToken()->getUser();

            if (!is_object($user) || !$user instanceof User) {
                新しい AccessDeniedException() をスローします。
            }

            $entity->setUpdatedBy($user);

            $uow = $em->getUnitOfWork();
            $meta = $em->getClassMetadata(get_class($entity));
            $uow->recomputeSingleEntityChangeSet($meta, $entity);
        }
    }
}
4

3 に答える 3

1

コマンド load-fixtures を呼び出すと、ログインしていません。おそらく$this->container->get('security.context')->getToken()null が返されますか?

于 2012-05-18T14:18:19.743 に答える
0

私の最終的なコード (Symfony 2.6):

1) リスナー:

<?php

namespace AppBundle\Listener;

use AppBundle\Entity\Post;
use AppBundle\Entity\Comment;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

/**
 * Class BlameableListener
 *
 * @package AppBundle\Listener
 */
class BlameableListener
{
    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    public function prePersist(LifeCycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Post || $entity instanceof Comment) {
            // is authentication information available?
            if (null !== $this->tokenStorage->getToken()) {
                // get User
                $user = $this->tokenStorage->getToken()->getUser();
                if (is_object($user)) {
                    $entity->setAuthorEmail($user->getEmail());
                }
            }
        }
    }
}

2) サービスとして設定

services:
    app.blameable.listener:
        class: AppBundle\Listener\BlameableListener
        arguments:
            - "@security.token_storage"
        tags:
            - { name: doctrine.event_listener, event: prePersist }
于 2015-06-17T20:12:07.313 に答える