Zend Framework 2 Custom ViewHelper 用于控制器中的特定操作

Zend Framework 2 Custom ViewHelper for specific action in a controller

是否可以在控制器内包含有关特定操作的视图助手。

事情是这样的,我正在显示带有交易记录的 table,但在将其显示到 html table 之前,我必须从记录中获得一些视图逻辑 return 由其他服务。此逻辑不是 suitable 放在服务端或视图中。所以我认为这是 ViewHelper 的用武之地。

根据网络教程,他们将 viewhelper 放在 module.config.php 中,并将其包含在 Module.php 的 bootstrap 部分中。现在,如果 viewhelper 在另一个控制器或操作(例如 "url" 中全局使用,那么这样做是可以的。买我的帮手只在一个控制器里面专门做这一个动作。

这是部分操作代码以及我目前如何在 Controller 中集成 viewhelper

<?php
function listAction() {
    $viewModel = new \Zend\View\Model\ViewModel();

    $service = $this->getServiceLocator();

    $transactionService = $service->get('TransactionService');
    $records = $transactionService->getTransaction();

    $helper = new \Transaction\View\Helper\TransactionViewHelper();
    $helper->setServiceLocator($service);
    $records = $helper->render($records);

    $viewModel->setVariable('records', $records);
    return $viewModel();
}
?>

它并不优雅,但它可以工作,但也许有更好的方法

viewhelper 的结构是这样的,我需要 servicelocator,因为我不知道如何在我的 viewhelper 中获取 "url" viewhelper,我需要阅读一些配置。此外,永远不会在 list.phtml

中调用助手
<?php

 class TransactionViewHelper extends \Zend\View\Helper\AbstractHelper implements \Zend\ServiceManager\ServiceLocatorAwareInterface {
     public function setServiceLocator(\Zend\ServiceManager\ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
        return $this;
    }

    public function getServiceLocator()
    {
        return $this->serviceLocator;
    }

    public function __invoke()
    { 
        return $this;
    }

    public function render($records)
    {
        //Some logic here
        return $result;
    }
}
?>

好的,找到更好的解决方案

我把它放在 module.config.php 作为 view_helpers > invokables,然后从 ViewHelperManager 调用它。这样 servicelocator 就自动注入了。

这是 module.config.php

的附加设置
<?php
//...
'view_helpers' => array(
    'invokables' => array(
         'transaction' => 'MyModule\View\Helper\TransactionViewHelper'
    )
)
//...
?>

这是特定操作的控制器代码

<?php
//...
function listAction() {
    $viewModel = new \Zend\View\Model\ViewModel();

    $service = $this->getServiceLocator();

    $transactionService = $service->get('TransactionService');
    $records = $transactionService->getTransaction();

    $helper = new \Transaction\View\Helper\TransactionViewHelper();
    $helper->setServiceLocator($service);
    $records = $helper->render($records);

    //The action it's call by ajaxAction so I use this one to return to that function
    //The ajaxAction function will format it to json 
    $viewHelperManager = $service->get('ViewHelperManager');
    $transactionRecord = $viewHelperManager->get('transaction');
    $result = $transactionRecord->render($records);
    return $result

    //If not ajax than just pass this variable to viewmodel
    //Then do echo $this->transactionRecord->render($records) in list.phtml
    $viewModel = new \Zend\View\Model\ViewModel();
    $viewModel->setVariable('records', $records);
    return $viewModel();

}
//...
?>

viewhelper class 变得更简单干净

<?php
class TransactionViewHelper extends \Zend\View\Helper\AbstractHelper {

    public function __invoke()
    { 
        return $this;
    }

    public function render($records)
    {
        //Some logic here
        return $result;
    }
}
?>

注意访问其他帮助插件,例如 'url' 只需在 viewhelper 中调用它

<?php
$url = $this->view->plugin('url');
$url('path/to/url', array('id' => ''));
?>