Получить экземпляр пользователя для анонимного пользователя - PullRequest
0 голосов
/ 22 октября 2018

Мой проект Symfony настроен довольно аккуратно, но я боролся с одной этой проблемой.

У меня есть класс App/Entity/User, который используется для заполнения пользовательской информации из базы данных

class User implements AdvancedUserInterface, \Serializable
{
    public function __construct()
    {
        $this->forumPermission = new ArrayCollection();
        $this->activities = new ArrayCollection();
    }

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(
     *     type="string",
     *     name="salt",
     *     length=32
     * )
     */
    private $salt = "";
    /**
     * @ORM\Column(
     *     type="string",
     *     length=75,
     *     name="user_name"
     * )
     * @Assert\NotBlank(
     *     message="De gebruikersnaam moet ingevuld zijn"
     * )
     */
    private $username;
    // ...
}

и правильно связаны в security.yaml

security:
    # https://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
    providers:
        db_provider:
            entity:
                class: App\Entity\User
                property: username

Однако, если пользователь не вошел в систему, он считается анонимным.Что мне показалось бы удобным, так это то, что анонимный пользователь имел бы собственный экземпляр User, но вместо этого $this->getUser() === null.Я понимаю, почему, но я упрямый:

У меня есть базовый контроллер, который я наследую от всех других моих контроллеров:

abstract class BaseController extends Controller
{
    protected $logger = null;
    protected $globals = null;
    protected $translator = null;
    protected $security = null;
    /* @var $currentUser User */
    protected $currentUser = null;

    public function __construct(
        Globals $globals,
        LoggerInterface $logger,
        TranslatorInterface $translator,
        Security $security
    ) {
        $this->logger = $logger;
        $this->globals = $globals;
        $this->translator = $translator;
        $this->currentUser = $security->getUser();
    }

    protected function getUser() {
        if (!$this->currentUser instanceof User) {
            /* @var $anonForumPerm ForumPermission */
            $anonForumPerm = $this->getDoctrine()->getRepository(ForumPermission::class)->find(5);
            $this->currentUser = new User();
            $this->currentUser->setName('Anonymous')
                ->setSurname('User')
                ->setUsername('anon.')
                ->setForumPermission($anonForumPerm)
            ;
        }
        return $this->currentUser;
    }
    // ...
}

Это, кажется, работает, но единственная проблема, которая у меня естьтеперь app.user ветки, которая остается нулевой.

Есть ли способ подтолкнуть $this->currentUser к app.user в ветке?Или есть лучший способ обработки анонимных пользователей?

Моя теория состоит в том, что я хочу иметь возможность выбирать между app.user ИЛИ IS_AUTHENTICATED_FULLY независимо от того, вошел ли пользователь в систему.

Был бы признателен за дополнительный вклад

1 Ответ

0 голосов
/ 22 октября 2018

Я также боролся с этой проблемой ранее, и вот некоторые дополнительные сведения из моего опыта.

Если посетитель вашего сайта не вошел в систему, Symfony выдаст ему AnonymousToken, который можно получитьв ветке на {{ app.token.user }}, которая возвращает строку anon.

Другой способ, который вы можете сделать, это просто проверить, не является ли {{ app.user }} null.

...