2017-03-17 96 views
1

我使用FOSBUNDLE用symfony 2.8我maked登錄FOSBUNDLE登錄會話/註冊和工作,並連接到成功的數據庫,但我有一個傳遞會話變量如何使用

其他網頁proplem我想這個簡單代碼輸出網頁上的會話,但我得到這個錯誤

無法啓動會話:已由PHP啓動。 當我刪除

$session = new Session(); 
$session->start(); 

我得到這個錯誤

注意:未定義的變量:會話

<?php 

namespace site\blogBundle\Controller; 
use AppBundle\Entity\User; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Session\Session; 
class DefaultController extends Controller 
{ 
    public function indexAction() 
    { 

     $session = new Session(); 
     $session->start(); 
     $session->set('username', 'Drak'); 
     $session->get('username'); 
     return $this->render('siteblogBundle:Default:index.html.twig' ['test' => $session]); 
    } 
} 

所以問題出在哪裏?

+0

如果您的用戶已通過身份驗證,您可以像這樣檢索它:$ user = $ this-> container-> get('security。上下文') - >爲gettoken() - >的getUser(); –

+0

@MathieuDormeval感謝你的工作 – mrsharko

回答

0

如果您的用戶進行身份驗證,你可以找回它,就像這樣:

$user = $this->container->get('security.context')->getToken()->getUs‌​er(); 

欲瞭解更多信息關於安全性,請檢查this ans。

1
(1) $session = new Session(); 
(2) $session->start(); 
(3) $session->set('username', 'Drak'); 
(4) $session->get('username'); 
(5) return $this->render('siteblogBundle:Default:index.html.twig' ['test' => $session]); 

(1)如果你想用一個會話中工作,你必須保留此行

(2)這是什麼導致了警告。根據您的設置,Symfony可能已經開始會話。您可以通過執行以下操作來防範此警告:

if (!$session->isStarted()) { 
    $session->start(); 
} 

(3)這將在會話中設置用戶名。請注意,這是您的用戶名,並且與Symfony的用戶管理無關。正如@Mathieu_Dormeval指出的,你可以從安全上下文中得到這個。 (4)這將檢索您存儲在會話中的密鑰username(在您的案例中來自(3)的名稱)中的任何內容。請注意,你不會將這個值賦給一個變量或輸出它,所以現在編寫它的方式有點沒用。

(5)這可能是您的問題的原因。由於我們無法看到模板,因此很難告訴您準確執行的操作。要獲得會話中所有數據的列表,您可以在index.html.twig中執行以下操作:

{{ dump(test.all) }} 

這隻會在開發模式下工作。 dump是Twig用來輸出原始數據的輔助方法,類似於PHP的var_dump()方法。您通過執行['test' => $session]將您的會話分配到(5)中的變量test。寫test.all轉儲裏面相當於像下面的PHP代碼:

var_dump($session->all()); 

調用all()將返回與存儲在會話中的所有數據的數組。更實際的方式來訪問您的會話中的數據,你可以查閱一下其他方法會話提供:https://symfony.com/doc/current/components/http_foundation/sessions.html#session-attributes

+1

關於(2)的快速評論你可以把它扔掉,正如文檔所說:「雖然建議顯式啓動會話,但會話實際上是按需啓動的,也就是說,如果有會話請求讀取/寫入會話數據「。所以通過訪問(3)中的會話,它將使用已經開始的會話或者開始一個新的會話。 – dbrumann

+0

偉大的答案你可以請在這個網站上測試文檔:http://stackoverflow.com/documentation/symfony2/topic-requests/23997 –

+0

對不起,我不太喜歡stackoverflow文檔。我覺得它會轉移應該進入官方文檔的資源。公平地說,會話管理的官方文檔不是太有幫助,我會嘗試找一些時間來改進這些。 – dbrumann