在控制器中使$ _SESSION可用

时间:2013-05-20 12:37:34

标签: php session model-view-controller session-variables

我正在尝试在我的框架的控制器中从头开始编写$_SESSION全局。它不是MVC,表示层由两个具有多个子类的父类组成。

如果不详细说明,我的观点会在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 Template。所有课程都是自动加载的。

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();
    }
} 

我的问题是如何在$_SESSION中提供CoreController以及在关机序列中何时可用?我已尝试直接在CoreController以及Template::render()内调用它,并始终获取未定义的变量警告,但在我的视图中定义$_SESSION仍有效。这背后的原因是我想根据会话ID是否设置来设置某些变量,并且我希望将大多数表示逻辑保留在我的控制器中。提前致谢。

1 个答案:

答案 0 :(得分:3)

会话是一种存储形式。这意味着,它只应在模型层中深入使用。

在表示层中操作$_SESSION与在控制器和/或视图中操作SQL相当。你将消除SoC的最后痕迹......虽然你已经通过实现像“ViewController”怪物这样的Rails来实现它。

您应该使用与sql类似的映射器,而不是在表示层中泄露存储逻辑。

  来自model layer

中某些服务的

public function identify( $parameters )
{

    $user = $this->domainObjectFacctory->create('user');
    $mapper = $this->mapperFactory->create('session');

    if ( $mapper->fetch($user, 'uid') === false )
    {
        $mapper = $this->mapperFactory->create('user');
        $user->setUsername($parameters['login']);
        $user->setPassword($parameters['pass']);

        $mapper->fetch($user);
    }

    $this->currentUser = $user->isValid()
                       ? $user
                       : null;
}

控制器仅与服务交互

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

服务工厂将被注入控制器(和附带的视图)构造函数。

  

注意:以上代码仅用于说明要点,不应在生产代码上进行复制粘贴或以其他方式嫁接。