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