5

コントローラーで Navigation オブジェクトを作成し、それをビューに渡します

$navigation = new \Zend\Navigation\Navigation(array(
    array(
            'label' => 'Album',
            'controller' => 'album',
            'action' => 'index',
            'route' => 'album',
        ),
    ));

そこを使おうとしている

<?php echo $this->navigation($this->navigation)->menu() ?>

そしてエラーを取得します:

致命的なエラー: Zend\Navigation\Exception\DomainException: Zend\Navigation\Page\Mvc::getHref は実行できません。Zend\Mvc\Router\RouteStackInterface インスタンスが Zend\View\Helper\Navigation\AbstractHelper.php の 471 行目に構成されていないためです。

しかし、ここに書かれているように、レイアウトで使用するナビゲーション: http://adam.lundrigan.ca/2012/07/quick-and-dirty-zf2-zend-navigation/が機能します。私の間違いは何ですか?

ありがとうございました。

4

3 に答える 3

10

問題は、Router (より正確にはZend\Mvc\Router\RouteStackInterface) が見つからないことです。ルート スタックはルートのコレクションであり、ルート名を使用してそれを URL に変換できます。基本的に、ルート名を受け取り、URL を作成します。

$url = $routeStack->assemble('my/route');

これは、MVC ページ内でも発生しZend\Navigationます。ページにはパラメーターがあり、使用可能なrouteルーターがある場合、ページは独自の URL (または) を組み立てます。ルーターを指定しないと、ルートを組み立てることができず、例外がスローされます。Zend\Navigationhref

ナビゲーションのすべてのページにルーターを挿入する必要があります。

$navigation = new Navigation($config);
$router     = $serviceLocator->get('router');

function injectRouter($navigation, $router) {
  foreach ($navigation->getPages() as $page) {
    if ($page instanceof MvcPage) {
      $page->setRouter($router);
    }

    if ($page->hasPages()) {
      injectRouter($page, $router);
    }
  }
}

ご覧のとおり、これは再帰関数であり、ルーターをすべてのページに挿入します。面倒!したがって、これを行う工場があります。これを実現するための 4 つの簡単な手順があります。

第一歩

最初にナビゲーション構成をモジュール構成に入れます。ナビゲーションがあるdefaultように、2 つ目のナビゲーションを作成できますsecondary

'navigation' => array(
    'secondary' => array(
        'page-1' => array(
            'label' => 'First page',
            'route' => 'route-1'
        ),
        'page-2' => array(
            'label' => 'Second page',
            'route' => 'route-2'
        ),
    ),
),

route-1最初のページ ( ) と 2 番目のページ ( )へのルートがありますroute-2

ステップ2

ファクトリはこれをナビゲーション オブジェクト構造に変換します。最初にそのためのクラスを作成する必要があります。SecondaryNavigationFactory.phpMyModule/Navigation/Service ディレクトリにファイルを作成します。

namespace MyModule\Navigation\Service;

use Zend\Navigation\Service\DefaultNavigationFactory;

class SecondaryNavigationFactory extends DefaultNavigationFactory
{
    protected function getName()
    {
        return 'secondary';
    }
}

ここに名前を入れsecondaryます。これはナビゲーション キーと同じです。

ステップ 3

このファクトリをサービス マネージャに登録する必要があります。その後、ファクトリはその作業を実行し、構成ファイルをZend\Navigationオブジェクトに変換できます。これは、module.config.php で行うことができます。

'service_manager' => array(
    'factories' => array(
        'secondary_navigation' => 'MyModule\Navigation\Service\SecondaryNavigationFactory'
    ),
)

ファクトリがインスタンスを返すサービスをsecondary_navigationここで作成したことを参照してください。Zend\Navigationこれを行う$sm->get('secondary_navigation')と、それがオブジェクトであることがわかりZend\Navigation\Navigationます。

ステップ 4

デフォルトのナビゲーションではなく、このナビゲーションを使用するようビュー ヘルパーに指示します。ナビゲーション ビュー ヘルパーは、必要なナビゲーションを指定できる "navigation" パラメーターを受け入れます。この場合、サービス マネージャーにはサービスがsecondary_navigationあり、それが必要なサービスです。

<?= $this->navigation('secondary_navigation')->menu() ?>

secondaryこれで、このビュー ヘルパーで使用されるナビゲーションができました。

開示:この答えは、私がこの質問で与えたものと同じです:https://stackoverflow.com/a/12973806/434223

于 2012-10-19T12:01:24.070 に答える
2

ところで。ルートがジェネリックであり、コントローラー/アクションが可変セグメントである場合にのみ、を定義する必要はありませんcontrolleractionroute

于 2012-10-08T18:40:35.560 に答える
0

問題は、ルーターなしではルートを解決できないことです。ナビゲーション クラスがその問題を解決することを期待していますが、明らかに自分でそれを行う必要があります。MVC ページでルーターを紹介するビュー ヘルパーを作成しました。

ビュー内での使用方法は次のとおりです。

$navigation = $this->navigation();
$navigation->addPage(
    array(
        'route' => 'language',
        'label' => 'language.list.nav'
    )
);
$this->registerNavigationRouter($navigation);
echo $navigation->menu()->render();

ビュー ヘルパー:

<?php
namespace JarJar\View\Helper;

use Zend\View\Helper\AbstractHelper;
use Zend\View\Helper\Navigation;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Navigation\Page\Mvc;

class RegisterNavigationRouter extends AbstractHelper implements ServiceLocatorAwareInterface
{
    protected $serviceLocator;

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
    }

    public function getServiceLocator()
    {
        return $this->serviceLocator;
    }

    public function __invoke(Navigation $navigation)
    {
        $router = $this->getRouter();
        foreach ($navigation->getPages() as $page) {
            if ($page instanceof Mvc) {
                $page->setRouter($router);
            }
        }
    }

    protected function getRouter()
    {
        $router = $this->getServiceLocator()->getServiceLocator()->get('router');
        return $router;
    }
}

ビュー ヘルパーを呼び出し可能なインスタンスとして構成に追加することを忘れないでください。

'view_helpers' => array(
    'invokables' => array(
        'registerNavigationRouter' => 'JarJar\View\Helper\RegisterNavigationRouter'
    )
),

それは素晴らしい解決策ではありませんが、うまくいきます。

于 2014-07-29T15:44:03.307 に答える