Module zend框架2中的路由

Module zend框架2中的路由,module,zend-framework2,Module,Zend Framework2,我正在努力将一些控制器的路由放在zend framework 2中,即使我读了很多书,我也不明白为什么它仍然告诉我请求的控制器无法映射到现有的控制器类。我有一个名为CRM的模块,在src文件夹中有联系人和公司,每个人都有Controller/Form/Model。这是我的module.config文件: array( 'controllers' => array( 'invokables' => array(

我正在努力将一些控制器的路由放在zend framework 2中,即使我读了很多书,我也不明白为什么它仍然告诉我请求的控制器无法映射到现有的控制器类。我有一个名为CRM的模块,在src文件夹中有联系人和公司,每个人都有Controller/Form/Model。这是我的module.config文件:

     array(
         'controllers' => array(
         'invokables' => array(
              'CRM\Controller\Contacts' => 'CRM\Controller\ContactsController',
          'CRM\Controller\Companies' => 'CRM\Controller\CompaniesController',
    ),
),


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

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



'view_manager' => array(
    'template_path_stack' => array(
        'contacts' => __DIR__ . '/../view/crm',
        'companies' => __DIR__ . '/../view/crm',
    ),
),
))


非常感谢您的帮助。

在配置的顶部,您有控制器可调用配置:

'CRM\Controller\Contacts' => 'CRM\Controller\ContactsController',
上面的第一个值是标识符。这就是在路线定义中要使用的内容。例如,您的
联系人
路线-尝试更改以下内容:

'defaults' => array(
     'controller' => 'CRM\Controller\Contacts',
     'action'     => 'index',
),

如果我正确理解了问题和您的结构,您需要在autoloader配置中设置名称空间

public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                // CRM
                __NAMESPACE__  => __DIR__ . '/src/' . __NAMESPACE__,
                // Contacts
                'Contacts' => __DIR__ . '/src/Contacts',
                // Companies
                'Companies' => __DIR__ . '/src/Companies',
            ),
        ),
    );
}

我已经尝试过了,但是在我更改CRM而不是Contacts之后,它给了我一个致命错误,即在第170行的..\vendor\..\AbstractPluginManager.php中找不到该类。有什么想法吗?现在检查类文件是否具有与CRM\Controller\ContactsController.php以及您的
module.config.php
s
getAutoloaderConfig()
相匹配的正确名称空间和类名,是否还有其他方法向您显示项目结构?我的意思是,我有这样的:module->CRM->src->Contacts->Controller->Contacts-Controller.php,php文件中的名称空间是Contacts\Controller;getAutoloaderConfig()在我的模块名为Contacts作为src中的实体时就已经存在并运行过了。首先对类名和名称空间进行排序。如果您的文件结构是
CRM/Contacts/Controller/contactscocontroller.php
,那么您的命名空间可能是
CRM\Contacts\Controller
,您的类名是
contactscocontroller
(这取决于您如何设置自动加载器)。在配置更新中,控制器可调用项使用完整的类名-
'CRM\controller\Contacts'=>'CRM\Contacts\controller\ContactsController'
。但Crisps answer可能更适合您的项目。我刚刚尝试在getAutoloaderConfig()中添加这些行,但似乎仍然不起作用。请求的控制器无法映射到现有的控制器类。@user2047893抱歉,您仍然需要在控制器配置的
invokables
部分映射控制器(即分别更改
CRM
前缀和
Contacts
companys
)我刚才看到你写了第二条评论。是的,这确实是个问题。我已经对它们进行了修改,而且效果很好。谢谢!