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' => ''));
?>
是否可以在控制器内包含有关特定操作的视图助手。
事情是这样的,我正在显示带有交易记录的 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' => ''));
?>