web-dev-qa-db-ja.com

ZF2でレイアウトおよびビューレンダラーを無効にする方法は?

Zend Framework 2.xでレイアウトおよびビューレンダラーを無効にするにはどうすればよいですか?私はドキュメントを読み、googleで探している答えを得ることができませんZend 1.xへの答えを見つけました、そしてそれは

$this->_helper->viewRenderer->setNoRender(true);
$this->_helper->layout->disableLayout();

しかし、Zend Framework 2.xではもう機能していません。 Ajaxリクエストのビューレンダラーとレイアウトの両方を無効にする必要があります。

どんな助けでも素晴らしいでしょう。

22
Viszman

レイアウトを無効にするには、コントローラーでsetTerminal(true)を使用するだけです。

ここに記載されているこの動作: Zend Viewクイックスタート::レイアウトの処理

例:

<?php
namespace YourApp\Controller;

use Zend\View\Model\ViewModel;

class FooController extends AbstractActionController
{
    public function fooAction()
    {
    $viewModel = new ViewModel();
    $viewModel->setVariables(array('key' => 'value'))
              ->setTerminal(true);

    return $viewModel;
    }
}

.phtmlファイルをレンダリングする代わりにJSON応答を送信する場合は、JsonRendererを使用してみます。

次の行をクラスの先頭に追加します。

use Zend\View\Model\JsonModel;

そしてここにJSONを返すアクションの例:

public function jsonAction()
{
    $data = ['Foo' => 'Bar', 'Baz' => 'Test'];
    return new JsonModel($data);
}

編集:

コントローラがJSONを返すことができるように、module.config.phpファイルにViewJsonStrategyを追加することを忘れないでください。 @Remiに感謝!

'view_manager' => [
    'strategies' => [
        'ViewJsonStrategy'
    ],
],
36
edigu

上記の回答について少し詳しく... json、xml、pdfなどのさまざまなタイプのファイルを動的に出力するときによく使用します...これはXMLファイルを出力する例です。

// In the controller
$r = $this->getResponse();

$r->setContent(file_get_contents($filePath)); //

$r->getHeaders()->addHeaders(
    array('Content-Type'=>'application/xml; charset=utf-8'));

return $r;

ビューはレンダリングされず、指定されたコンテンツとヘッダーのみが送信されます。

4
Katya S

これをアクションの最後に追加できます:

return $this->getResponse();
4
vcsfrl