使用工厂时,zf2新模块控制器解析为无效的控制器类或别名

时间:2016-12-24 17:57:45

标签: php zend-framework zend-framework2

我在应用程序模块配置中有以下内容:

'controllers' => [
        'factories' => [
            Application\Controller\IndexController::class => Application\Controller\IndexControllerFactory::class
        ],
    ],

这很好用。现在我的serve module我几乎一样:

'controllers' => array(
                    /**
                    'invokables' => array(
                            'Serve\Controller\Index' => 'Serve\Controller\IndexController',
                    ),
                    */

                    'factories' => array(
                            Controller\IndexController::class => Serve\Controller\IndexControllerFactory::class
                    )

            ),

当我加载主页时,我通过api访问服务控制器。这样做我在主页上遇到了这个问题:

Serve\Controller\Index (resolves to invalid controller class or alias: Serve\Controller\Index)

就像我说我通过api访问服务控制器所以当通过系统请求api时可能是一个设置问题。

有趣的是,当我这样做时,它有效:

'controllers'=>array(
    'invokables' => array(
                    'Serve\Controller\Index' => 'Serve\Controller\IndexController',
            )),

不确定这里是不是错了

更新:

这似乎有效:

'factories' => array(
                    'Serve\Controller\Index' => IndexControllerFactory::class
            )       

然而我喜欢使用::class语法

1 个答案:

答案 0 :(得分:1)

当您映射到控制器时,问题出在您的路由配置中: -templates -admin base.html 但您从未在TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, "templates"),], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'sekizai.context_processors.sekizai', 'cms.context_processors.cms_settings', ], }, }, ] 中使用该特定密钥注册该控制器,或者您使用了错误的密钥值" 控制器"在控制器映射中指定FQCN时,在路径中。

Serve\Controller\Index

或者在您的路线中,配置不使用module.config但使用FQCN,以便它直接使用Factory而不是您设置的别名。像:

// module.config
'aliases' => [
    'Serve\Controller\Index' => Serve\Controller\IndexController:class,
],
'factories' => [
    Serve\Controller\IndexController:class => Serve\Controller\IndexControllerFactory::class,
],

我继续使用FQCN在工厂映射中映射我的类,如果我想用另一个名称调用别名,则添加别名。因此,您现在可以使用FQCN或其任何别名,例如:Serve\Controller\Index