【问题标题】:Zend Framework: How to call an Action from a View?Zend 框架:如何从视图中调用动作?
【发布时间】:2012-04-20 20:14:17
【问题描述】:

当我尝试从视图脚本调用操作时,我遇到了 Action View Helper 的问题。该视图位于 /views/scripts/home 中,它属于 HomeController,我想从 BookController 访问一个操作。

我认为有以下代码:

foreach ($this->books as $book) {

    if (!empty($book['asin'])) {     
        $bookObj = $this->action('get-book-by-asin', 'book', null, 
                                 array('asin' => $book['asin']));

在 getBookByAsinAction() 中,我想返回一个 $data 变量。如何将其作为对 Action View Helper 调用的响应发回?

我现在可以通过控制器中的 $books 变量执行 foreach ,而不是在我的视图中执行此操作,但我只是好奇。或者,也许将来我会在特定操作可以生成更有用的可重用内容或“小部件化”内容时使用 Action View Helper。

如果我从数据库查询中获得很多行,那么只做一个 foreach 而不是两个会更好吗?一个 foreach 将在 View 中,以正确呈现结果,我应该考虑在 Controller 中执行另一个 foreach 以检查一本书是否有 ASIN,然后调用例如一个网络服务。这是最优解吗?

还是按照描述的方式使用 Action View Helper 更好?

【问题讨论】:

  • 这违背了 MVC 模式的基本原则,最好重构你的代码——一个动作方法不应该返回任何数据,视图不能访问控制器。 getBookByAsin() 属于模型空间,或者使用视图助手。
  • 这样的业务逻辑应该早在你进入你的视野之前就发生了。

标签: php zend-framework


【解决方案1】:

您可以创建一个新的操作助手,然后在您的视图中使用操作助手代理调用它:

假设您创建了一个名为 getBookByAsin 的操作助手:

在代码视图中:

$gbba= Zend_Controller_Action_HelperBroker::getStaticHelper('getBookByAsin');

$var = $gbba->direct("asin");

【讨论】:

  • 为什么要在视图中使用 action 助手?还有 view 助手。
【解决方案2】:

我的解决方案是使用以下行结束 getBookByAsinAction():$this->_response->setBody(json_encode($data)); 并在我的视图中 $book = (array) json_decode($bookObj);

我没有为此操作创建 get-book-by-asin.phtml 视图,所以我添加了$this->_helper->viewRenderer->setNoRender();

【讨论】:

  • 我已编辑此答案以将您在其中提出的问题移至您的原始问题中。请记住,这是一个问答网站,而不是论坛。答案,不应包含问题。很高兴您找到了问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多