Я пытаюсь сделать глобальный доступ $_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
в моих представлениях работает. Обоснованием этого является то, что я хотел бы установить определенные переменные на основе того, установлен ли идентификатор сеанса, и я бы хотел сохранить основную логику представления в своих контроллерах. Заранее спасибо.
Сессия – это форма хранения. Это означает, что его следует использовать только в пределах слоя модели.
Манипулирование $_SESSION
в слое представления было бы сопоставимо с выбором языка SQL в контроллерах и / или представлениях. Вы бы уничтожили последние остатки SoC … хотя вы уже были на нем, внедряя Rails как «монтируемость ViewController».
Вместо того, чтобы утечка логики хранения на уровне презентации, вы должны использовать аналогичные mappers, например, для 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 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'), ]); }
Заводская установка будет введена в конструктор контроллера (и сопутствующий вид).
Примечание: приведенный выше код предназначен только для иллюстрации точки и не должен быть скопирован или иным образом перенесен на производственный код.