【问题标题】:Zend Framework 2 Custom ViewHelper for specific action in a controllerZend Framework 2 Custom ViewHelper 用于控制器中的特定操作
【发布时间】:2015-01-02 05:41:54
【问题描述】:

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

事情是这样的,我正在显示一个带有事务记录的表,但在将其显示到 html 表之前,我必须从其他服务返回的记录中获取一些视图逻辑。这个逻辑不适合放在Service端和视图中。所以我认为这就是 ViewHelper 的用武之地。

从网络上的教程中,他们将 viewhelper 放在 module.config.php 中,并将其包含在 Module.php 的引导部分中。现在,如果 viewhelper 在另一个控制器或诸如“url”之类的操作中全局使用,则可以这样做。 Buy my helper 仅用于一个控制器内的这一操作。

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

<?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 中调用 helper

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

【问题讨论】:

    标签: php zend-framework2


    【解决方案1】:

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

    我把它放在module.config.php中作为view_helpers > invokables,然后从ViewHelperManager调用它。这样服务定位器就会自动注入。

    这是 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 类变得更加简洁干净

    <?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' => ''));
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      相关资源
      最近更新 更多