2

我有一个应用程序,我们使用 AbstractRestfulController 和 Json 策略。(我们有使用这种方法的直接要求)。所以我们所有的请求都是通过带有 json 的 jQuery Ajax 完成的。现在我有下载存储在服务器上的 pdf 文件的特定要求。我想使用 php/zend 头文件下载文件,而不是公开文件的实际 http 路径。

以下Restful方法是否有任何解决方案。我正在考虑针对特定操作的覆盖视图策略,但不知道如何?

我将有一种最终方法来为特定模块使用默认 AbstractActionController 并将我的代码放入其中。但是,如果这将是我唯一的解决方案(因为将当前模块特定的代码移动到另一个模块中看起来是个坏主意)?

4

1 回答 1

3

请参阅下面添加您自己的视图策略的示例,您可以在文档中查看示例:

http://framework.zend.com/manual/2.0/en/modules/zend.view.quick-start.html

如果这是您想要的方式,很容易修改示例以检查给定的控制器/操作。

<?php
namespace Application;

class Module
{
    public function onBootstrap($e)
    {
        // Register a "render" event, at high priority (so it executes prior
        // to the view attempting to render)
        $app = $e->getApplication();
        $app->getEventManager()->attach('render', array($this, 'registerJsonStrategy'), 100);
    }

    public function registerJsonStrategy($e)
    {
        $app          = $e->getTarget();
        $locator      = $app->getServiceManager();
        $view         = $locator->get('Zend\View\View');
        $phpStrateogy = $locator->get('PhpRendererStrategy');
        // or any you have setup in your config...
        $jsonStrategy = $locator->get('ViewJsonStrategy');

        $routeMatch = $e->getRouteMatch();
        /* @var $routeMatch \Zend\Mvc\Router\RouteMatch */
        $routeName = $routeMatch->getMatchedRouteName();
        if($routeName == 'myroute') {
            // possible change layout?
            //$controller->layout('app/layout/new_layout');
            // Attach strategy, which is a listener aggregate, at high priority
            //$view->getEventManager()->attach($jsonStrategy , 100);
            $view->getEventManager()->attach($phpStrateogy, 1);
        }
    }
}

或者,您可以只返回不同类型的 ViewModel,如果启用了两种策略,您可以通过在控制器中返回不同的模型来更改使用的策略:

public function someAction()
{
    // will use JsonRenderer
    return new \Zend\View\Model\JsonModel(array('bob'));

    // Will use PHPRenderer
    return new \Zend\View\Model\ViewModel(array('bob'));
}
于 2013-02-11T10:57:43.403 回答