我正在尝试在我的框架的控制器中从头开始编写$_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是否设置来设置某些变量,并且我希望将大多数表示逻辑保留在我的控制器中。提前致谢。
答案 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'),
]);
}
服务工厂将被注入控制器(和附带的视图)构造函数。
注意:以上代码仅用于说明要点,不应在生产代码上进行复制粘贴或以其他方式嫁接。