0

Zend Framework 2 の開発を始めたばかりです。アプリケーションに簡単なメニューを追加しようとしています。メニューは最終的にユーザー定義可能なブックマークとしてデータベースから読み込まれるため、現時点では、定義したビュー ヘルパーをインスタンス化し、プログラムでコントローラーにページを追加し、ビュー ヘルパーのナビゲーションをビューに挿入しようとしています。モデル。私の問題は、ServiceLocator を使用してコントローラーでビュー ヘルパーを取得しようとすると、次のようになることServiceNotFoundExceptionです。

Application\View\Helper\ShortcutsMenu:

    namespace Application\View\Helper;

    use Zend\Navigation\Navigation;

    class ShortcutsMenu extends Navigation {

        public function shortcutsMenu() {
            //...
        }

        public function __construct() {
            //...
        }

    }

そしてModule.phpで

public function getServiceConfig() {
    return array(
        'view_helper' => array(
            'factories' => array(
                'shortcutsmenu' => function($sm) {
                    $smenu = new \Application\View\Helper\ShortcutsMenu();
                    return $smenu;
                }
            ),
        ),
    );

IndexController.php:

    $smenu = $this->getServiceLocator()->get('shortcutsmenu'); // throws ServiceNotFoundException
    //"Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for shortcutsmenu"

    $smenu->addPage(AbstractPage::factory(array(
        'label' => 'Homepage',
        'order' => '-1',
        'uri' => '/',
    )));

    // ...
}

何が欠けているのか誰か教えてもらえますか?

編集: アプリケーション全体のレイアウトで生成したい HTML は次のようになります。

<!-- Side tabs shortcuts -->
<ul id="shortcuts">
    <li class="current"><a href="./" class="shortcut-home" title="Home">Home</a></li>
    <li><a href="userpage1.html" title="My messages">My messages</a></li>
    <li><a href="/a/b/c?id=4" title="Bob's calendar">Bob's calendar</a></li>
    <li>...</li>
</ul>

おそらく、MVC リンクではなく URI スタイルのリンクを使用しています。

4

1 に答える 1

2

ナビゲーション コンテナーを拡張しZend\Navigation\Navigationたり、組み込みのビュー ヘルパーを拡張してメニューをレンダリングする必要はありません。

コンテナーは、ナビゲーション構造内のすべてのページを管理します。コンテナを作成するにはいくつかの方法があります。

すべてのビュー ヘルパー(メニュー、ブレッドクラム) は、コンテナーをナビゲーション データのプロバイダーとして使用します。を使用して、ビュー ヘルパーに新しいコンテナーを設定できますsetContainer()。または、コンテナーを設定せずにビューでビュー ヘルパーを呼び出すだけで、ビュー ヘルパーが新しい空のコンテナーを作成します。

デフォルトのビュー ヘルパーが提供していないために別のレンダリングが必要な場合は、独自のナビゲーション ビュー ヘルパーを作成できます。

namespace MyNamespace\View\Helper\Navigation;

use Zend\View\Helper\Navigation\AbstractHelper;

class MyHelper extends AbstractHelper
{
}

次に、ビュー ヘルパーをナビゲーション pluginManager に登録します。このようなことができると思います(テストされていません):

class Module
{
    public function onBootstrap($e)
    {
        $application = $e->getApplication();
        /** @var $serviceManager \Zend\ServiceManager\ServiceManager */
        $serviceManager = $application->getServiceManager();

        $pm = $serviceManager->get('ViewHelperManager')->get('Navigation')->getPluginManager();
        $pm->setInvokableClass('myHelper', 'MyNamespace\View\Helper\Navigation\MyHelper');
    }
}

ビューでカスタム ヘルパーを呼び出します。

$this->navigation()->myHelper()
于 2013-02-22T08:37:34.860 に答える