2013-07-22 6 views
0

Мне нужно передать данные от контроллера в свой пользовательский помощник. Я пытался сделать это двумя способами, но, к сожалению, я не могу заставить его работать.
Я зарегистрировал помощник в module.config.phpZF2 - Как передать данные от контроллера к помощнику

Первый способ я пытался передать переменные из контроллера помощника:
В моем контроллере:

public function indexAction() 
{ 
     $this->data = $this->getApplicationTable()->getTypes(); 

     $helper = new TestHelper(); 
     $helper->setVariables($this->data); 
} 

Вот мой помощник:

class TestHelper extends AbstractHelper { 

    public $data; 


    public function __invoke() 
    { 
     var_dump($this->data); // output null 
     return $this->getView()->render('helper-view.phtml', $this->data); 
    } 



    public function setVariables($var) 
    { 
     if($var){ 
      $this->data = $var; 
      var_dump($this->data) // output array with correct data 
     } 
    } 



} 

В макете, я показываю это так:

<?php echo $this->testHelper(); ?> 

И я получил ошибку из helper-view.phtml, эта переменная пуста.

Второй способ я попытался основан на инъекции зависимостей

Мой module.php:

public function getServiceConfig() 
    { 
     return array(
      'factories' => array(
       'Application\Model\ApplicationTable' => function($sm) { 
        $tableGateway = $sm->get('ApplicationTableGateway'); 
        $table = new ApplicationTable($tableGateway); 
        return $table; 
       }, 
       'ApplicationTableGateway' => function ($sm) { 
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
        return new TableGateway('tableName', $dbAdapter); 
       }, 
      ), 
     ); 
    } 

public function getViewHelperConfig() 
{ 
    return array(
     'factories' => array(
      'TestHelper' => function ($helperPluginManager) { 
       $sm = $helperPluginManager->getServiceLocator(); 
       $tableGateway = $sm->get('Application\Model\ApplicationTable'); 
       $viewHelper = new TestHelper(); 
       $viewHelper->setTableGateway($tableGateway); 
       return $viewHelper; 
      } 
     ), 
    ); 
} 

Мой Helper:

class TestHelper extends AbstractHelper { 

    public $tableGateway; 


    public function __invoke() 
    { 
     $data = $this->tableGateway->getTypes(); 

     return $this->getView()->render('helper-view.phtml', $data); 
    } 



    public function setTableGateway($tableGateway) 
    { 
     $this->tableGateway = $tableGateway; 
    } 


} 

я получил такую ​​же ошибку, как и в первом способе ,
Буду признателен за любую помощь.

+0

«ошибка из helper-view.phtml, эта переменная пуста». Какая переменная пуста? – rwilson04

ответ

1

Это не работает, потому что вызов $ this-> testHelper(); создаст новый экземпляр TestHelper, который не знает о $ data, setVariables никогда не вызывался для этого экземпляра. Также я не вернул бы представление внутри помощника, оставьте это, если возможно, в контроллере. Помощник используется для предоставления вспомогательных методов для просмотра, см. Документацию: http://framework.zend.com/manual/2.2/en/modules/zend.view.helpers.advanced-usage.html#writing-custom-helpers

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

Внутри indexAction вы установите переменные данные и дать переменное зрение:

public function indexAction() { 
    $data = $this->getApplicationTable()->getTypes(); 
    return new \Zend\View\Model\ViewModel(array(
     'data' => $data, 
    )); 
} 

Изменения Helper: Удалить метод setVariables и добавить в подписи призывает $ data param. Кстати, хорошая практика - установить переменную в частную и добавить сеттеры и геттеры.

class TestHelper extends AbstractHelper { 

    private $_data; 

    public function __invoke($data) { 
     $this->setData($data); 
     return var_dump($this->getData()); 
    } 

    public function setData($data) { 
     $this->_data = $data; 
    } 

    public function getData() { 
     return $this->_data; 
    } 

} 

Теперь в вашем index.phtml вы можете получить $ данные от контроллера и передать его помощнику:

$data = $this->data; 
echo $this->testHelper($data); 

Вот и все.

+0

Спасибо за ваш ответ, к сожалению, я не использую view (index.phtml) в этом действии. Это своего рода большая карта, которая не имеет содержания, поэтому я не могу передать ее из вида. – user1409508

+0

Что именно должно произойти на indexAction? Если вы дадите мне объяснение, я соответствующим образом обновлю ответ. – meberhard

+0

Мне нужно использовать хелпер для отображения флажков в макете (который похож на карту). Для этого мне нужно получить информацию из базы данных и передать ее помощнику. – user1409508

0

Если вы хотите сделать это с помощью инъекции зависимостей, вам необходимо передать tableGateway в качестве параметра во время строительства. В противном случае вы можете передать его во время вызова.Для последнего, если это возможно, сделайте следующее:

class TestHelper extends AbstractHelper { 

    public function __invoke($tableGateway) 
    { 
     $data = $tableGateway->getTypes(); 

     return $this->getView()->render('helper-view.phtml', $data); 
    } 

и в макете:

<?php echo $this->testHelper($tableGateway); ?>

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

public function getViewHelperConfig() 
{ 
    return array(
     'factories' => array(
      'TestHelper' => function ($helperPluginManager) { 
       $sm = $helperPluginManager->getServiceLocator(); 
       $tableGateway = $sm->get('Application\Model\ApplicationTable'); 
       $viewHelper = new TestHelper($tableGateway); 
       return $viewHelper; 
      } 
     ), 
    ); 
} 

и

class TestHelper extends AbstractHelper { 
    protected $tableGateway;   

    public function __construct($tableGateway) 
    { 
     $this->tableGateway = $tableGateway; 
    } 

    public function __invoke() 
    { 
     $data = $this->tableGateway->getTypes(); 
     return $this->getView()->render('helper-view.phtml', $data); 
    } 

} 

и в макете:

<?php echo $this->testHelper(); ?>

у меня нет достаточной информации или достаточно кода, чтобы убедиться, что это будет работать в вашей ситуации, но вы можете проверьте http://zendblog.shinymayhem.com/2013/09/using-servicemanager-as-inversion-of.html для получения дополнительной информации о фабриках и инъекции зависимостей.

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