1

我正在尝试在$_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();
    }
} 

我的问题是我如何才能$_SESSIONCoreController关机序列中使用它以及何时可以使用它?我试过直接在里面和里面调用它,CoreController并且Template::render()总是得到未定义的变量警告,但是$_SESSION在我的视图中定义是有效的。这背后的原因是我想根据是否设置会话 ID 来设置某些变量,并且我想将大多数表示逻辑保留在我的控制器中。提前致谢。

4

1 回答 1

3

Session是一种存储形式。这意味着,它只能在模型层的深处使用。

在表示层中进行操作$_SESSION与在控制器和/或视图中拧 SQL 相当。您将消除SoC的最后痕迹……尽管您已经通过实现像“ViewController”怪物这样的 Rails 来做到这一点。

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

来自模型层中的某些服务

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'),
        ]);
}

服务工厂将被注入到控制器(以及随附的视图)的构造函数中。

注意:以上代码仅用于说明这一点,不应复制粘贴或以其他方式移植到生产代码上。

于 2013-05-20T13:17:42.150 回答