在symfony2.8中更新了用户和会话

时间:2018-04-26 09:33:17

标签: php symfony twig

我正在使用symfony 2.8并且我正在尝试:

如果用户第一次连接,则会显示一个弹出窗口。我有一个字段" last_login"所以我所做的就是看看" last_login"为null并显示弹出窗口。但问题是我的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 :(得分:2)

我认为您的问题是您正在创建新会话而不是注入当前会话。但是,您应该将订阅者添加到Symfony Security组件的InteractiveLoginEvent,而不是推断相当复杂的Doctrine事件并根据需要收听太多事件。给它一个优先级,在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) }}然后从那里拿走它。