2013-03-11 3 views
2

Я пытаюсь преобразовать существующее приложение из Zend Framework 1 в Zend Framework 2, и у меня небольшие проблемы.Передача значений для просмотра в Zend Framework 2

В первоначальной заявке я имел следующее в моих контроллеров

function init() 
{ 
    $this->initialize_values(); 
} 

Все мои контроллеры расширенный базовый класс, который имел эту функцию в нем, как показано здесь.

protected function initialize_values() 
{ 

    $this->_db = Zend_Registry::get('dbAdapter'); 
    $this->_current_user = new User(&$this->_db); 

    $this->_auth = Zend_Auth::getInstance(); 
    if($this->_auth->hasIdentity()) 
    { 
     $this->_current_user = unserialize($_SESSION['current_user']); 
     $this->view->current_user = $this->_current_user; 
    } 
} 

Я воспроизвел все функции, кроме последней строки, где я установил это значение представления.

Кажется, что во всех примерах, которые я нахожу для ZF2, они возвращают массив или viewmodel. Я не вижу способа передать значение представлению, не привязанному к функции действия.

ответ

9

Это потому, что вам нужно создать new ViewModel() и вернуть его вызывающему скрипту. В зависимости от того, что вы возвращаете с вашего контроллера, запускается соответствующий рендерер.

Например, если я возвращаю блок HTML, я бы использовал

return new ViewModel(array('results' => $results)); 

в конце моего действия контроллера. Однако, если я хотел поставить вывод JSON я бы вернуть

return new JsonModel($results); 

В вашем случае, вы могли бы подготовить модель представления и хранить его в защищенной переменной и добавить переменные к ней, как это:

// in your constructor 
$this->_view = new ViewModel(); 

// in your initialize values method 
$this->_view->setVariable($name, $value); 

Затем, когда готов к выходу:

// in your controller action 
return $this->_view; 
1

Все, что вам нужно сделать, это хранить все переменные вида в массив и возвращает массив. Вам не требуются классы или стратегии, такие как ViewModel или JsonModel, если вам не нужны дополнительные функции.

До тех пор, пока ваши действия в вашем контроллере возвращают массивы, вы можете передать эти значения в представление.

так:

public function indexAction() 
{ 
    $current_user = $this->getSession(); 
    return array(
     'current_user' => $current_user   
); 
} 

И действительно пойти ZF2, использовать ServiceManagers и ServiceLocators вместо Zend_Registry. Вы можете назначить менеджеров служб в файле Module.php, создав функцию getServiceConfig(), если она еще не существует. Это должно выглядеть примерно так.

public function getServiceConfig() 
{ 
    'factories' => array(
    'session' => function ($sm){ 
     return new Session($sm->get('Zend/Db/Adapter/Adapter')); 
    } 
    ) 
} 

который я бы также добавить адаптер дб через файл database.local.php в глобальной конфигурации/автозагрузку файл с service_manager.

так:

<?php 
$Params = array(
'database' => 'YOUR DATABASE', 
'username' => 'YOUR USERNAME', 
'password' => 'YOUR PASSWORD', 
'hostname' => 'YOUR HOSTNAME', 
); 

return array(
'service_manager' => array(
'factories' => array(
    'Zend\Db\Adapter\Adapter' => function ($sm) use ($Params) { 
     return new Zend\Db\Adapter\Adapter(array(
      'driver' => 'pdo', 
      'dsn'  => 'mysql:dbname='.$Params['database'].';host='.$Params['hostname'], 
      'database' => $Params['database'], 
      'username' => $Params['username'], 
      'password' => $Params['password'], 
      'hostname' => $Params['hostname'], 
     )); 
    }, 

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

protected $session; 
public function getSession() 
{ 
    if($this->session == null) 
    { 
     $sl = $this->getServiceLocator(); 
     $this->session = $sl->get('session'); 
    } 
    return $this->session; 
} 
+0

Мне нравится ваш ответ, но я заблудился в layout.phtml I не может найти переменные, даже не используя $ this-> variable_name, что я делаю неправильно? –

1

У меня есть модуль приложения, который загружает основной файл layout.phtml. Я добавил следующий код, и он работал для меня (ZF 2.2.2).

Применения/module.php в onBootstrap (MvcEvent $ е):

$auth = new AuthenticationService(); 
$authenticated = false; 
if ($auth->hasIdentity()) { 
    $authenticated = true; 
} 
$viewModel = $e->getViewModel(); 
$viewModel->setVariable('authenticated', $authenticated); 

В layout.phtml:

<?php 
if ($this->authenticated === true) { ?> 
    <li class="active"><a href="<?php echo $this->url('logout') ?>"><?php echo $this->translate('Logout') ?></a></li> 
<?php } else { ?> 
    <li class="active"><a href="<?php echo $this->url('login') ?>"><?php echo $this->translate('Login') ?></a></li> 
    <li class="active"><a href="<?php echo $this->url('register') ?>"><?php echo $this->translate('Sign Up') ?></a></li> 
<?php } ?> 
+0

$ authenticated = false; объявление переменной должно быть сделано, чтобы избежать ошибки во время проверки подлинности. –

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