2013-05-20 3 views
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(); 
    } 
} 

Мой вопрос, как я могу сделать $_SESSION доступны в CoreController и когда именно он доступен во время процедуры выключения? Я пробовал называть его непосредственно в CoreController, а также в пределах Template::render() и всегда получать неопределенные предупреждения переменных, однако определение $_SESSION в моих представлениях работает. Обоснованием этого является то, что я хотел бы установить определенные переменные на основе того, установлен ли идентификатор сеанса, и я бы хотел сохранить основную логику представления в своих контроллерах. Заранее спасибо.

+0

Просто позвоните session_start во время начальной загрузки фазы процесса, и вы должны быть в состоянии получить на него в течение срока запроса – Orangepill

+0

Ваше предложение отлично работает, спасибо еще раз! ваш совет сервера на днях был спасателем. Интересно, должен ли я делать то, что предложил тереско, и использовать его в пределах слоя модели, что, вероятно, будет связано с отправкой его через диспетчера, который кажется лучшим подходом, если я буду придирчивым. – dcd0181

+0

IMHO принадлежит к контроллеру. Если вы поместите его в модальный, вы создаете зависимость между модальным и используемым шаблоном, который требует сеанса, поэтому использование модального слова в сценарии было бы невозможным. – Orangepill

ответ

3

Сессия - это форма хранения. Это означает, что его следует использовать только в пределах слоя модели.

Манипулирование $_SESSION в слое представления будет сопоставимо с выбором языка SQL в контроллерах и/или представлениях. Вы бы уничтожили последние остатки SoC ... хотя вы уже были на нем, внедряя Rails как «монтируемость ViewController».

Вместо того, чтобы протекать логика хранения в слое презентации, вы должны использовать аналогичные mappers, например, для 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'), 
     ]); 
} 

служба завод будет введен в контроллер (и сопровождающее вида) конструктор.

Примечание: приведенные выше код только для иллюстрации точки и не должен быть наклеены копирования или иным образом привитыми на коде производства.

+0

Спасибо за предложение, как лучше всего справиться с этим? Я думал о том, чтобы определить $ _SESSION в диспетчере, чем называть его внутри родительской модели. – dcd0181

+0

Инициализация объекта сеанса (абстракция для '$ _SESSION' usperglobal) должна выполняться на заводе, что создает для [data mappers] (http://martinfowler.com/eaaCatalog/dataMapper.html) для этих служб. Тот же завод также обеспечит, чтобы объект сеанса создавался только один раз, без необходимости одиночных или других плохих методов. –

+0

Итак, с этой точки зрения, если я понимаю, инициализируйте $ _SESSION в памяти, а затем взаимодействуйте с ним через уровень представления, прощайте стенографию. Похоже, это самый логичный подход. – dcd0181

Смежные вопросы