2

重複の可能性:
ZF2でZF1 $ this-> actionを使用するにはどうすればよいですか?

私は数年前からPHPを使用しており、OOPについてはよく知っていますが、Zend Framework 2の初心者であり、その概念に問題があります。

私はウェブサイトを開発しようとしていますが、すでに完了していますが、現在はZF2を使用しています。

私の最大の問題の1つは、レイアウト/ビューにあります(私はすでにそれらの違いを知っています)。

そのWebサイトには、動的に生成されるサイドバーメニューがあります(DBから取得したコンテンツ...CategoriesController内でsideBarGenActionを呼び出しましょう)。そして、それをすべてのページ(レイアウトテンプレート内)に表示​​する必要があります。だから、それは私の疑問です:他のすべてのアクション内でそのアクション(sideBarGenAction)を呼び出さずにそれを行う方法は?

サイドバーに静的コンテンツがある場合は、$ this-> partialを使用できますが、動的コンテンツがあり、partialには変数を渡す必要があります。

ViewHelperを作成できると思いますが、あまり意味がありません(ウィジェットではないため、モデル内のビジネスルールです...必要なすべての機能に対してViewHelperを作成する必要がある場合ビューの「内部」と呼ばれるので、MVCフレームワークは必要ありません)。

4

1 に答える 1

3

したがって、モデルには、データの断片を取得するための再利用可能な単体テスト可能なメソッドが必要です。これには、文字列、オブジェクト、配列などがあります。これは、データを適切に処理するロジックがあるため、意味のある方法で使用でき、また、単体にすることができます。テスト済み。

コントローラでは、そのモデルのインスタンスをインスタンス化し、使用するデータを取得するために必要なメソッドを使用します。次に、それをビューに渡します。これで、これをアクション自体に含めることができます。または、これを実行してデータを返す再利用可能なメソッドを作成して、他のアクションでも使用できるようにすることができます。これが他のコントローラーでも使用できるものである場合は、おそらくコントローラーが使用するアクションヘルパーを作成する必要があります....要点を理解します...同じものを設計する方法はたくさんあります。再利用可能なコードにどれだけ集中しているか。

コントローラからzf1のビューにデータを渡すには、次のようにする必要があります。

$this->view->whateverItIsCalled = $someValueOrArrayTypeThing;

次に、ビューでそれを使用したり、エコーしたりします。$this->whateverItIsCalled.

zf2ではこんな感じ

namespace Content\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class ArticleController extends AbstractActionController
{
    public function viewAction()
    {
        // get the article from the persistence layer, etc...

        $view = new ViewModel();

        $articleView = new ViewModel(array('article' => $article));
        $articleView->setTemplate('content/article');

        $primarySidebarView = new ViewModel();
        $primarySidebarView->setTemplate('content/main-sidebar');

        $secondarySidebarView = new ViewModel();
        $secondarySidebarView->setTemplate('content/secondary-sidebar');

        $sidebarBlockView = new ViewModel();
        $sidebarBlockView->setTemplate('content/block');

        $secondarySidebarView->addChild($sidebarBlockView, 'block');

        $view->addChild($articleView, 'article')
             ->addChild($primarySidebarView, 'sidebar_primary')
             ->addChild($secondarySidebarView, 'sidebar_secondary');

        return $view;
    }
}

ビューは、zf1で以前に使用したものと同じようにそれを使用します。

<?php // "content/article" template ?>
<div class="row content">
    <?php echo $this->article ?>

    <?php echo $this->sidebar_primary ?>

    <?php echo $this->sidebar_secondary ?>
</div>

<?php // "content/article" template ?>
    <!-- This is from the $articleView View Model, and the "content/article"
         template -->
    <article class="span8">
        <?php echo $this->escapeHtml('article') ?>
    </article>

<?php // "content/main-sidebar" template ?>
    <!-- This is from the $primarySidebarView View Model, and the
         "content/main-sidebar" template -->
    <div class="span2 sidebar">
        sidebar content...
    </div>

<?php // "content/secondary-sidebar template ?>
    <!-- This is from the $secondarySidebarView View Model, and the
         "content/secondary-sidebar" template -->
    <div class="span2 sidebar pull-right">
        <?php echo $this->block ?>
    </div>

<?php // "content/block template ?>
        <!-- This is from the $sidebarBlockView View Model, and the
            "content/block" template -->
        <div class="block">
            block content...
        </div>

新しいビューモデルをインスタンス化してから、ビューに物事を渡す方法を確認できるだけでなく、異なる、より具体的なパーシャルを指定することもできます。

とにかく、それがあなたを助けることを願っています。基本的に、簡単に言えば、ZF2はいくつかの理由でZF1よりもパフォーマンスを向上させますが、オーバーヘッドを削減することは重要な理由です。多くのフレームワークは、ほとんどの場合、必要なときに必要なものだけが必要になるため、これを実行します。

于 2012-11-28T02:57:02.393 に答える