0

我需要将数据从控制器传递到我的自定义视图助手。我尝试以两种方式做到这一点,但不幸的是我无法让它发挥作用。
我已经在 module.config.php 中注册了助手

我尝试将变量从控制器传递给助手的第一种方法
: 在我的控制器中:

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 得到错误,该变量为空。

我尝试的第二种方法是基于依赖注入

我的模块.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;
            }
        ),
    );
}

我的助手:

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;
    }


}

我得到了与第一种方式相同的错误。
我将不胜感激任何帮助。

4

2 回答 2

1

它不起作用,因为调用 $this->testHelper(); 将创建一个新的 TestHelper 实例,它不知道 $data,从未为此实例调用 setVariables。此外,我不会返回助手内部的视图,如果可能的话,将其留在控制器中。helper 用于为视图提供帮助方法,请参阅文档: http: //framework.zend.com/manual/2.2/en/modules/zend.view.helpers.advanced-usage.html#writing-custom-帮手

一个简单的解决方案,如何在没有 DI 的情况下做到这一点:将所需的数据从控制器提供给视图,以便视图可以在需要时将数据提供给帮助程序:

在 indexAction 中,设置数据变量并将变量提供给视图:

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

更改您的助手:删除 setVariables 方法并添加调用 $data 参数的签名。顺便说一句,将变量设置为私有并添加 setter 和 getter 是一种很好的做法。

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 并将其传递给助手:

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

就这样。

于 2013-07-22T12:11:53.960 回答
1

如果要通过依赖注入来做到这一点,则需要在构造过程中将 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以获取有关工厂和依赖注入的更多信息。

于 2013-09-11T22:48:33.033 回答