ServiceNotCreatedException в Zend Framework 2 при попытке нескольких переходов

Я пытаюсь создать несколько навигационных меню для использования в моем приложении на основе определенной роли пользователя. Большая часть кода похожа на zfc-admin. Когда я использую zfc-admin в своем приложении, я могу вызвать меню администратора, однако у меня будет около четырех ролей, и я решил добавить это в свой модуль Application.

module.config.php

'navigation' => array(
    'admin' => array(
        array(
            'label' => 'Admin Home',
            'route' => 'adminhome',
        ),
    ),
    'default' => array(
        array(
            'label' => 'Home',
            'route' => 'home',
        ),
    ),
),

AdminNavigationFactory.php

namespace Application\Navigation\Service;
use Zend\Navigation\Service\DefaultNavigationFactory;

class AdminNavigationFactory extends DefaultNavigationFactory
{
    protected function getName()
    {
        return 'admin';
    }
}

Module.php

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'admin_navigation' => 'Application\Navigation\Service\AdminNavigationFactory',
        ),
    );
}

layout.phtml

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

Я получаю ошибку.

Fatal error: Uncaught exception 'Zend\ServiceManager\Exception\ServiceNotCreatedException' with message 'While attempting to create adminnavigation(alias: admin_navigation) an invalid factory was registered for this instance type.' in /Applications/MAMP/htdocs/myapp/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php on line 987

Если я изменю layout.phtml, чтобы использовать меню по умолчанию, все работает как положено.

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

1 ответ

Сначала я получил точно такой же вопрос. После перемещения фабричной конфигурации из метода getServiceConfig() в классе модуля в module.config.php все заработало.

Теперь моя админская навигация работает следующим образом:

module.config.php

(Модуль / Admin / конфигурации / module.config.php)

return array(
    // yada yada yada...
    'service_manager' => array(
        'factories' => array(
            'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory',
            'adminnav' => 'Application\Navigation\Service\AdminNavigationFactory',
        ),
    ),
    'navigation'      => array(
        'default' => array(
            array(
                'label' => 'Home',
                'route' => 'home',
            ),
            array(
                'label' => 'Filme',
                'route' => 'movies',
            ),
            array(
                'label' => 'Admin',
                'route' => 'admin',
            ),
        ),
        'adminnav' => array(
            array(
                'label' => 'Film hinzufügen',
                'route' => 'add-movie',
            ),
            array(
                'label' => 'Buch hinzufügen',
                'route' => 'add-book',
            ),
        ),
    ),
);

AdminNavigationFactory

(Модуль / Application/SRC / Application / Navigation / Услуги / AdminNavigationFactory.php)

namespace Application\Navigation\Service;

use Zend\Navigation\Service\DefaultNavigationFactory;

class AdminNavigationFactory extends DefaultNavigationFactory
{
    protected function getName()
    {
        return 'adminnav';
    }
} 

Может быть, вы хотите проверить код в контексте всего приложения, поэтому вот ссылки на мой github:

  1. AdminNavigationFactory
  2. module.config.php

С уважением, Саша

Другие вопросы по тегам