問題はルーターがないことです(より正確には、Zend\Mvc\Router\RouteStackInterface
)。ルートスタックはルートのコレクションであり、ルート名を使用してそれをURLに変換できます。基本的に、ルート名を受け入れ、URLを作成します。
$url = $routeStack->assemble('my/route');
これは、のMVCページ内でも発生しZend\Navigation
ます。ページにはroute
パラメーターがあり、使用可能なルーターがある場合、ページはそれ自体のURL(またはZend\Navigation
用語ではhref
)をアセンブルします。ルーターを指定しないと、ルートをアセンブルできないため、例外がスローされます。
ナビゲーションのすべてのページにルーターを挿入する必要があります。
$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.php
MyModule / 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
これで、このビューヘルパーでナビゲーションを使用できるようになります。