簡體   English   中英

在symfony2.8中更新了用戶和會話

[英]updated user and session in symfony2.8

我正在使用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>

但是兩者都給了我空洞的結果(我很確定用戶已更新)

我認為您的問題是您正在創建一個新會話,而不是注入當前會話。 但是,您應該推斷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) }}並從那里拿走。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM