it-swarm.com.ru

Zend Framework 2: Router "разрешает недопустимый класс контроллера или псевдоним:"

Я ищу некоторую помощь с конфигурацией маршрутизатора ZF2.

Я хотел бы добавить несколько контроллеров к одному модулю в контексте разработки, хотя в конечном итоге придется выяснить, как указать конкретные маршруты.

Для этого я сейчас пытаюсь использовать файл общего назначения module.config, указанный в документации по быстрому запуску MVC. Однако, похоже, это не работает так, как подсказывает документация ZF2.

http://framework.zend.com/manual/2.0/en/modules/zend.mvc.quick-start.html

Примечания к документации:

"ZendSkeletonApplication поставляется с" маршрутом по умолчанию ", который, скорее всего, приведет вас к этому действию. Этот маршрут в основном ожидает"/{module}/{controller}/{action} ", что позволяет вам указать это:"/zend-user/Привет/мир ". Мы собираемся создать маршрут в основном для иллюстрации, так как создание явных маршрутов является рекомендуемой практикой".

Однако, контроллер отображает/landlord,/landlord/home/index, но не/landlord/sandbox/index. Дом и песочница являются контроллерами. Песочница была названа в соответствии с соглашением об именовании "SandboxController". Я полагаю, что, возможно, раздел кода child_routes в документации нуждается в некоторой модификации, которую я пропустил.

В экземпляре песочницы я получаю эту ошибку на странице ошибки 404.

Landlord\Controller\Sandbox (преобразуется в недопустимый класс контроллера или псевдоним: Landlord\Controller\Sandbox)

Я попытался добавить 'Landlord\Controller\Sandbox' => 'Landlord\Controller\SandboxController' в вызываемые объекты, но это создает ошибку.

Мой контроллер указан ниже:

return array(
'controllers' => array(
    'invokables' => array(
        'Landlord\Controller\Home' => 'Landlord\Controller\HomeController',

    ),
),
'router' => array(
    'routes' => array(
        'landlord' => array(
            'type'    => 'Literal',
            'options' => array(
                // Change this to something specific to your module
                'route'    => '/landlord',
                'defaults' => array(
                    // Change this value to reflect the namespace in which
                    // the controllers for your module are found
                    '__NAMESPACE__' => 'Landlord\Controller',
                    'controller'    => 'home',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                // This route is a sane default when developing a module;
                // as you solidify the routes for your module, however,
                // you may want to remove it and replace it with more
                // specific routes.
                'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '/[:controller[/:action]]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        ),
    ),
),
'view_manager' => array(
    'template_path_stack' => array(
        'landlord' => __DIR__ . '/../view',
    ),
),
);

Если есть простой способ напрямую настроить URL-адреса, это также будет полезно, или действительно хороший учебник, который также будет оценен.

11
Greg.Forbes

Проблема здесь в том, что даже если маршрутизатор попытается направить ваш новый контроллер, который вы добавили, вам все равно нужно добавить часть Invokable для каждого отдельного контроллера, который вы добавляете. Таким образом, с вашим маршрутизатором все в порядке, но если вы добавите, например, новый AboutController, вам нужно будет изменить верхнюю часть вашей конфигурации следующим образом ...

return array(
'controllers' => array(
    'invokables' => array(
        'Landlord\Controller\Home' => 'Landlord\Controller\HomeController',
        'Landlord\Controller\About' => 'Landlord\Controller\AboutController',
    ),
),
24
Will H

Просто найдите ответ ... размещая здесь, это может помочь кому-то ... Я предполагаю, что вы следовали примеру модуля альбома, предоставленного zf2 docs, и теперь добавляете новые модули, как в моем случае 'Admin', и я добавляю новые контроллеры, такие как администратор, новости и т. д.,

Вот настройки роутеров ...

'router' => array(
        'routes' => array(
            'admin' => array(
                'type' => 'segment',
                'options' => array(
                    'route' => '/admin/admin[/:action][/:id]',
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id' => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Admin\Controller\Admin',
                        'action' => 'index',
                    ),
                ),

            ),
            'news' => array(
                'type' => 'segment',
                'options' => array(
                    'route' => '/admin/news[/:action][/:id]',
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id' => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Admin\Controller\News',
                        'action' => 'index',
                    ),
                ),

            ),
        ),
    ),

И вот добавь свой контроллер ..

'controllers' => array(
        'invokables' => array(
            'Admin\Controller\News' => 'Admin\Controller\NewsController',
            'Admin\Controller\Admin' => 'Admin\Controller\AdminController',

        ),
    ),

Теперь вы можете вызывать ваши контроллеры с помощью вашего модуля, как здесь, в моем случае

localhost/{foldername}/admin/news/index and localhost/{foldername}/admin/admin/index

Спасибо

3
Sohail

Я был в том же случае, я нашел решение, как и в предыдущем посте, но я думаю, что это не лучший способ.

Для того, чтобы добавить le "clientController" внутри моего routeur:

'router' => array(
    'routes' => array(
        'home' => array(
            'type' => 'Zend\Mvc\Router\Http\Literal',
            'options' => array(
                'route' => '/',
                'defaults' => array(
                    'controller' => 'Fcm\Controller\Index',
                    'action' => 'index',
                ),
            ),
        ),
        'client' => array(
            'type' => 'Segment',
            'options' => array(
                'route' => '/client[/:action][/:id]',
                'constraints' => array(
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id' => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Fcm\Controller\Client',
                    'action' => 'index',
                ),
            ),
        ),
    ),
),
1
Eddz le Bijoutier

настройте маршрутизацию так:
Модуль: - Пользователи
Контроллер: - IndexController

'router' => array(
        'routes' => array(
            'users' => array(
                'type' => 'Literal',
                'options' => array(
                    // Change this to something specific toyour module
                    'route' => '/users',
                    'defaults' => array(
                                // Change this value to reflect the namespace in which
                        // the controllers for your module are found
                        '__NAMESPACE__' => 'Users\Controller',
                        'controller' => 'Index',
                        'action' => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'default' => array(
                        'type' => 'Segment',
                        'options' => array(
                            'route' =>
                            '/[:controller[/:action][/:id]]',
                            'constraints' => array(
                                'controller' =>'[a-zA-Z][a-zA-Z0-9_-]*',
                                'action' =>'[a-zA-Z][a-zA-Z0-9_-]*',
                                'id' =>'[0-9]+',
                            ),
                            'defaults' => array(
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
0
Rajesh Patel