問題是缺少一個路由器(或更準確地說,一個Zend\Mvc\Router\RouteStackInterface
)。路由堆棧是路由的集合,可以使用路由名稱將其轉換爲url。基本上,它接受一個路由名稱,併爲您創建一個URL:
$url = $routeStack->assemble('my/route');
出現這種情況的Zend\Navigation
的MVC頁面內了。該頁面有一個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);
}
}
}
:
必須注入在導航的每一頁路由器。乏味!因此有一家工廠爲你做這件事。有四個簡單的步驟來做到這一點。
STEP ONE
把導航配置您的模塊配置第一。正如您有default
導航一樣,您可以創建另一個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
)和第二頁(route-2
)。
第二步
一家工廠將轉換成一個導航對象結構這一點,你需要首先創建一個類。在MyModule/Navigation/Service目錄下創建一個文件SecondaryNavigationFactory.php
。
namespace MyModule\Navigation\Service;
use Zend\Navigation\Service\DefaultNavigationFactory;
class SecondaryNavigationFactory extends DefaultNavigationFactory
{
protected function getName()
{
return 'secondary';
}
}
看到我把名字secondary
在這裏,這是你的導航鍵相同。
第三步
您必須註冊這個工廠到服務管理。然後工廠可以完成它的工作,並將配置文件轉換爲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
對象。
第四步
告訴視圖助手來使用這個導航,而不是默認的。導航視圖助手接受一個「導航」參數,您可以在其中指定您想要的導航。在這種情況下,服務經理有一個服務secondary_navigation
,這是我們需要的。
<?= $this->navigation('secondary_navigation')->menu() ?>
現在您將在此視圖助手中使用導航secondary
。
披露:這個答案是一樣的,因爲我介紹了這個問題:https://stackoverflow.com/a/12973806/434223
你是對的,感謝您的意見。但如果這樣修復公告頁面錯誤仍然存在。 '$導航=新\ Zend的\導航\導航(陣列( \t \t \t陣列( \t \t \t \t '標籤'> '相冊', \t:當代碼運行,當它看起來那麼唯一的選擇\t \t \t 'URI'=> '/' \t \t \t) \t \t));'當URL被直接設置。 – Eremite
hm不知道,但你有這在你的module.php? '$ application = $ e-> getApplication(); $ eventManager = $ application-> getEventManager(); $ moduleRouteListener = new ModuleRouteListener(); $ moduleRouteListener-> attach($ eventManager);' –
是的在onBootstrap的方法中的Module.php中我有完全相同的代碼。有趣的是我的視圖中的url視圖助手能夠正常工作。代碼'$ this-> url('album/default',array('controller'=>'album','action'=>'edit','id'=> $ id))''很好,顯示一個鏈接在頁面上。目前尚不清楚是否干擾了菜單的正確顯示。如果有任何想法,我會很高興聽到他們。謝謝。 – Eremite