2013-05-20 55 views
1

我試圖使我的框架的控制器中的$_SESSION全局可用從頭開始編寫。它不是MVC,表示層由兩個具有多個子類的父類組成。

沒有進入非常詳細,我的意見是一個構造函數中實例化class Template後呈現在class Template

class Template{ 

    protected $_controller; 
    protected $_action; 

    function __construct($controller,$action) { 
     $this->_controller = $controller; 
     $this->_action = $action; 
    } 

    function render(){ 
     if (file_exists(APP_ROOT . DS . 'app' . DS . 'view' . DS . $this->_controller . DS . $this->_action . '.php')) { 
      include (APP_ROOT . DS . 'app' . DS . 'view' . DS . $this->_controller . DS . $this->_action . '.php'); 
     } 
    } 

} 

然後我打電話給我的父母控制器內的析構函數Template::render()。所有類都在自動加載。

class CoreController { 

    protected $_controller; 
    protected $_action; 
    protected $_template; 

    function __construct($controller, $action) { 
     $this->_controller = ucfirst($controller); 
     $this->_action = $action; 

     $this->_template = new Template($controller,$action); 
    } 

    function __destruct() { 
     $this->_template->render(); 
    } 
} 

我的問題是如何才能讓在CoreController提供$_SESSION,準確地在關斷期間可供選擇?我試過在CoreController以及Template::render()中直接調用它,並總是獲取未定義的變量警告,但是在我的視圖中定義了$_SESSION。這背後的原因是我想根據是否設置會話ID來設置某些變量,並且希望將大多數表示邏輯保留在我的控制器中。提前致謝。

+0

只是在過程的引導階段再次調用session_start,你應該能夠過來請求 – Orangepill

+0

的生活得到您的建議的偉大工程,謝謝!你的服務器提示有一天是一個救星。我想知道我是否應該做teresko建議並在模型層中使用它,這可能需要通過調度程序發送它,如果我挑剔的話,這似乎是一個更好的方法。 – dcd0181

+0

恕我直言,它屬於控制器。如果你把它放在模態中,你正在建立需要會話的模態和使用模式之間的依賴關係,所以在腳本中使用模態說不可能。 – Orangepill

回答

3

會話是一種存儲形式。這意味着,它只應該在模型層深處使用。

在表示層中操縱$_SESSION與在控制器和/或視圖中綁定SQL相當。你將會消除SoC的最後一個痕跡......儘管你已經通過實現諸如「ViewController」怪物之類的Rails了。

您不應該在表示層泄漏存儲邏輯,而應該使用類似於SQL的映射器。

一些服務model layer

​​

控制器只與服務

public function postLogin($request) 
{ 
    $auth = $this->serviceFactory->create('recognition'); 
    $auth->identify([ 
     'login' => $request->getParameter('username'), 
     'pass' => $request->getParameter('password'), 
     ]); 
} 

服務工廠相互作用會在控制器的注入(和伴隨的視圖的)構造函數。

注:上述代碼是僅用於說明的點,並且不應該被複制粘貼或以其他方式接枝在生產代碼。

+0

感謝您的建議,處理此問題的最佳方法是什麼?我想在調度器中定義$ _SESSION,而不是在父模型構造中調用它。 – dcd0181

+0

會話對象的初始化($ _SESSION' usperglobal的抽象)應該在工廠完成,它會爲服務創建[數據映射器](http://martinfowler.com/eaaCatalog/dataMapper.html)。同一工廠也可以確保會話對象只創建一次,而不需要單例或其他不好的做法。 –

+0

好吧,從這個角度來看,如果我明白了,在內存中初始化$ _SESSION,然後通過表示層與它交互,原諒速記。似乎最合乎邏輯的方法。 – dcd0181