Php 使$\u会话在控制器中可用

Php 使$\u会话在控制器中可用,php,session,model-view-controller,session-variables,Php,Session,Model View Controller,Session Variables,我正试图使从头编写的框架控制器中的$\u会话全局可用。它不是MVC,表示层由两个父类和多个子类组成 我的视图在类模板 class Template{ protected $_controller; protected $_action; function __construct($controller,$action) { $this->_controller = $controller; $this->_action =

我正试图使从头编写的框架控制器中的
$\u会话
全局可用。它不是MVC,表示层由两个父类和多个子类组成

我的视图在
类模板

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

我的问题是如何使
$\u会话
CoreController
中可用,以及在关机顺序期间它何时可用?我曾尝试在
CoreController
中以及在
Template::render()
中直接调用它,并且总是得到未定义的变量警告,但是在我的视图中定义
$\u会话
是可行的。这背后的原因是,我希望根据会话id是否设置来设置某些变量,并且我希望在控制器中保留大多数表示逻辑。提前谢谢

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

在表示层中操纵
$\u会话
,可以与在控制器和/或视图中编写SQL相媲美。你会清除最后的痕迹。。。尽管您已经通过实现类似“ViewController”怪物的Rails实现了它

您应该使用类似于sql的映射程序,而不是在表示层泄漏存储逻辑

从某处服役

控制器仅与服务交互

public function postLogin( $request )
{
    $auth = $this->serviceFactory->create('recognition');
    $auth->identify([
        'login' => $request->getParameter('username'),
        'pass'  => $request->getParameter('password'),
        ]);
}
服务工厂将被注入控制器(以及附带视图)的构造函数中

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


只需在流程的引导阶段调用session_start,您就可以在请求的整个生命周期中完成它。您的建议非常有效,再次感谢!前几天你的服务器提示是个救星。我想知道我是否应该按照teresko的建议在模型层中使用它,这可能需要通过dispatcher发送它,如果我很挑剔的话,这似乎是一个更好的方法。如果你把它放在模式中,你就是在模式和使用模式之间创建了一个依赖关系,需要会话,所以在from脚本中使用模式是不可能的。@Orangepill,所以,仅仅因为你不想抽象超全局,你就决定破坏SoC?
$\u会话是一个超全局的,所以它在任何地方都可用。在关机阶段,超全局进程在其中被终止,会话中的某个时间被关闭。约翰·施吕特(Johannes Schlüter)的精彩演讲,参见约25:50谢谢你的建议,处理这个问题的最佳方式是什么?我在考虑在dispatcher中定义$\u会话,而不是在父模型构造中调用它。会话对象的初始化(会话对象的抽象
$\u会话
usperglobal)应该在工厂中完成,这将为服务创建。同一个工厂还将确保会话对象只创建一次,而不需要单例或其他不良做法。因此,从这个角度来看,如果我理解,请在内存中初始化$\u会话,然后通过表示层与它交互,请原谅这种简化。似乎是最合乎逻辑的方法。
public function postLogin( $request )
{
    $auth = $this->serviceFactory->create('recognition');
    $auth->identify([
        'login' => $request->getParameter('username'),
        'pass'  => $request->getParameter('password'),
        ]);
}