是否可以在控制器内部的特定操作中包含viewhelper。
这就是事情,我显示了一个包含事务记录的表,但是在将它显示到html表之前,我必须从其他服务返回的记录中获得一些视图逻辑。此逻辑不适合放在服务端和视图中。所以我认为这是ViewHelper的用武之地。
从Web教程中,他们将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的结构是这样的,我需要服务器,因为我不知道如何获得&#34; url&#34; viewhelper在我的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;
}
}
?>
答案 0 :(得分:0)
好的找到了更好的解决方案
我把它放在module.config.php中作为view_helpers&gt; 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类变得更加简单和干净
<?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' => ''));
?>