обновлен пользователь и сессия в symfony2.8 - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю с Symfony 2.8 и пытаюсь сделать:

Если пользователь подключается в первый раз, появляется всплывающее окно. У меня есть поле "last_login", так что я сделал, чтобы увидеть, если "last_login" является нулевым и отобразить всплывающее окно. Но проблема в том, что мое vue генерируется после того, как last_login установлен, поэтому он не работает. Тогда я попытался создать слушателя:

class firstLoginModalListener
{
    public function preUpdate(PreUpdateEventArgs $eventArgs)
    {
        if ($eventArgs->getEntity() instanceof User) {
            if ($eventArgs->hasChangedField('lastLogin')) {
                if($eventArgs->getOldValue('lastLogin')==null){
                    //do something here 
                };
            }
        }
    }
}

Но даже прежде чем пытаться это сделать, я должен знать, как отправить информацию на мою веточку, поэтому я попробовал это (просто для проверки связи между веткой и слушателем):

class firstLoginModalListener
{
    public function preUpdate(PreUpdateEventArgs $eventArgs)
    {
        if ($eventArgs->getEntity() instanceof User) {
            $session = new Session();
            $session->start();
            $session->set('name','test');
            $session->getFlashBag()->add('notice', 'Profile updated');
        }
    }
}

и попробовал несколько вещей в моей веточке:

 <script type="text/javascript">
        $(document).ready(function () {
            {% for flashMessage in app.session.flashbag.get('notice') %}
                console.log('{{ flashMessage }}')
            {% endfor %}
            alert('ok')
        })
    </script>

и:

 <script type="text/javascript">
        $(document).ready(function () {
            console.log('{{ app.session.get('name') }}')
        })
    </script>

Но оба дали мне пустой результат (я почти уверен, что пользователь обновился)

1 Ответ

0 голосов
/ 26 апреля 2018

Я думаю, что ваша проблема в том, что вы создаете новый сеанс, а не вводите текущий.Однако вместо того, чтобы экстраполировать события Doctrine, которые являются достаточно сложными и прослушивают слишком много событий для того, что вам нужно, вы должны добавить подписчика к компоненту Symfony Security InteractiveLoginEvent.Присвойте ему приоритет, который поймает его раньше, чем FOS\UserBundle\Security\InteractiveLoginListener.

app.event.listener.first_login_listener:
    class: App\Event\Listener\FirstLoginListener
    arguments: ['@session']
    tags:
        - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin, priority: 10 }

Затем установите сеанс до того, как будет установлен last_login:

<?php

namespace App\Event\Listener;

class FirstLoginListener
{
    /**
     * @var Session
     */
    private $session;

    /**
     * @param Session $session
     */
    public function __construct(Session $session)
    {
        $this->session = $session;
    }

    /**
     * @param InteractiveLoginEvent $event
     */
    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
        $user = $event->getAuthenticationToken()->getUser();
        if ($user instanceof UserInterface && $user->getLastLogin() === null) {
            $this->session->set('welcome', 'Welcome to your account');
        }
    }
}

Что касается бита веточки, попробуйте просто {{ dump(app.session) }} и возьми оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...