2

AbstractRestfulController と Json 戦略を使用するアプリケーションがあります。(このアプローチを使用するための明確な要件があります)。したがって、すべてのリクエストは json を使用して jQuery Ajax を介して行われます。今、サーバーに保存されているpdfファイルをダウンロードするための特定の要件があります。ファイルの実際の http パスを公開する代わりに、ダウンロード ファイルに php/zend ヘッダーを使用したいと考えています。

この次の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 に答える