2014-10-14 3 views
0

Я хотел бы хранить данные, например. имя пользователя и фамилию, чтобы отображать их во многих макетах. Я хочу установить некоторую переменную в одном контроллере и использовать ее в макете.Глобальное хранилище данных в Zend Framework 2

Любые решения?

Я создал несколько подобных макетов, где я положил:

<span id="STATUS">LOGGED: <span id="USERNAME"><?php echo $this->name. ' ' . $this->surname; ?></span>

Но, во-первых, в некоторых действий контроллера я получаю имя и фамилию из базы данных:

$db = $this->getServiceLocator()->get('MyDatabase'); $sql = 'SELECT * FROM Users'; $statement = $db->query($sql);/ $result = $statement->execute();

Тогда я установил статические переменные в контроллере:

self::$name = $result['name']; self::$surname = $result['surname'];

Далее в действиях я изменить расположение и передать переменные к нему:

$this->layout('layout/student'); $this->layout()->name = self::$name; $this->layout()->surname = self::$surname;

Но я не хочу получать данные из базы данных в каждом контроллерах и передавать переменные в каждом из действий.

+0

вы можете дать более подробную информацию? Когда вы говорите «Макеты», вы говорите о макете по умолчанию или макете действий? – dixromos98

+0

Я создал новый макет для некоторого действия, и я изменяю макет в некоторых действиях в разных контроллерах по макету '$ this-> ('layout/mylayout);' –

+0

Хорошо. Пожалуйста, добавьте код и детали того, что вы хотели бы достичь, чтобы я мог попробовать и помочь вам. – dixromos98

ответ

0

Хорошо, это мое решение.

Внутри вашего module.php

public function onBootstrap(MvcEvent $e) 
{ 

    $sharedEvents = $e->getApplication()->getEventManager()->getSharedManager(); 
    $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) { 
    //This event will only be fired when an ActionController under the MyModule namespace is dispatched. 
    $controller = $e->getTarget(); 

    //to be able to view actions and controllers 
    $params = $e->getApplication()->getMvcEvent()->getRouteMatch()->getParams(); 
    $nameSurnameArray = $controller->getServiceLocator()->get('NAMEOFTABLEWITHSQL')->getNameSurname(); 
     if($params['action'] == 'test'){ 

     $controller->layout('layout/testlayout'); 
     $controller->layout()->name = $nameSurnameArray['name']; 
     $controller->layout()->surname = $nameSurnameArray['surname']'; 
     } 

    }, 100); 

    $eventManager  = $e->getApplication()->getEventManager(); 
    $serviceManager  = $e->getApplication()->getServiceManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 
    $this->bootstrapSession($e); 
} 

Итак, если маршрут тест Действие затем testLayout загружается и я помещаемые в макете имя и фамилию я получил из базы данных. Аналогично вы можете указать контроллер ($ params ['controller'] == 'testModule \ Controller \ testController') вместо действия, если у вас одинаковый макет для одного контроллера.

Это решение можно улучшить, я думаю, но, надеюсь, он направит вас в нужное русло

+0

ОК спасибо, но мне интересно, можно ли использовать какое-то хранилище или какой-нибудь контейнер для хранения необходимых переменных и получить его в макете или отправить его во все макеты и читать только там, где это необходимо? –

+0

После успешной проверки подлинности вы можете добавить внутри массива данные, которые вы хотели бы сохранить в хранилище служб аутентификации. Тогда вы можете получить доступ к этим данным внутри своего контроллера. – dixromos98

+0

Хорошо, спасибо, но знаете ли вы, как я могу прочитать некоторые данные с помощью '$ this-> getServiceLocator() -> get ('AuthService') -> getStorage() -> read() -> userName; 'в статическом контексте? –