rest - zf2 中不同模块中的相同 Controller 名称

标签 rest zend-framework2

我今天刚刚发现 zf2 并不真正喜欢 2 个 Controller 具有相同的名称,即使它们不在同一个模块中。 但是,我需要能够打电话 本地主机/用户/类型 和 本地主机/消息/类型

目前,我的两个 Controller 具有相同的名称。 我还发现,无论模块的名称是什么,我总是会得到消息/类型的结果,即使使用 localhost/nonexistingmodule/types oO

这是我的 module.config.php 的样子:

return array(
    'controllers' => array(
        'invokales' => array(
            'messages' => 'Messages\Controller\MessagesController,
            'messages' => 'Messages\Controller\TypesController,
        ),
    ),
    'di' => array(
        'instance' => array(
            'alias' = array(),
        ),
    ),
    'router' => array(
        'routes => array(
            'restful' => array(
                'type' => 'Zend\Mvc\Router\Http\Segment'
                'options' => array(
                    'route' => '/Messages/:controller[.:formatter][/:id],
                    'constraints' => array(
                        'module' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'formater' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id' => '[a-zA-Z0-9_-]*',
                    ),
                    'defaults' => array(
                        'module' => 'Messages',
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array( ... ),
);

我尝试在约束中设置 'module' => 'Messages' (我们永远不知道:p),但我遇到了 404 错误。 任务模块的 module.config.php 是相同的,但用于任务。 我最初有别名,但在我读到一些不太推荐的地方后,我删除了它们。

还有一件事,这是一个 REST API,我的所有 Controller 都扩展了 AbstractRestfulController(如果这很重要)

有人知道如何使我的 2 网址正常工作吗?

谢谢:)

最佳答案

可调用或服务以及其他任何内容的别名应该是唯一的。如果它们不是唯一的,则它们可能会被另一个模块按照模块本身加载的顺序覆盖。这意味着:在设置可调用或任何类型的别名时,请确保别名唯一有意义。就我个人而言,我这样命名我的 Controller :

'invokables' => array(
    'mymodule-controller-controllername' => 'Mymodule\Controller\ControllernameController'
)

与服务或任何其他类型的别名相同

'services' => array(
    'mymodule-service-servicename' => 'Mymodule\Service\Classname'
)

文档遵循命名空间风格的语法,例如...

'invokables' => array(
    'Mymodule\Controller\Controllername' => 'Mymodule\Controller\ControllernameController'
)

...我个人觉得这完全令人困惑,因为它太像命名空间了,并且并没有真正自动暗示它只是一个别名/键

现在你的评论问题我不明白。您想将一条路线两个不同的 Controller 匹配吗?那是不可能的,也是毫无意义的。

使用路由配置更新答案

对于路由配置,您有几种可能的方法。就我个人而言,我花了很多精力来建立文字路线,因为它们是最快的,但也需要大量的手动关注。另外,还有一些分段路线会抑制他们更多的魔力。我将为您介绍字面的方法:

模块消息

'controllers' => array(
    'invokables' => array(
        'messages-controller-index' => 'Messages\Controller\IndexController',
    )
),
'router' => array(
    'routes' => array(
        'messages' => array(
            'type' => 'literal',
            'options' => array(
                'route' => '/messages',
                'defaults' => array(
                    'controller' => 'messages-controller-index',
                    'action'     => 'index'
                )
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'types' => array(
                    'type' => 'literal',
                    'options' => array(
                        'route' => '/types',
                        'defaults' => array(
                            'action' => 'types'
                        )
                    )
                )
            )
        )
    )
)

模块任务

'controllers' => array(
    'invokables' => array(
        'tasks-controller-index' => 'Tasks\Controller\IndexController',
    )
),
'router' => array(
    'routes' => array(
        'tasks' => array(
            'type' => 'literal',
            'options' => array(
                'route' => '/tasks',
                'defaults' => array(
                    'controller' => 'tasks-controller-index',
                    'action'     => 'index'
                )
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'types' => array(
                    'type' => 'literal',
                    'options' => array(
                        'route' => '/types',
                        'defaults' => array(
                            'action' => 'types'
                        )
                    )
                )
            )
        )
    )
)

所以发生的事情是:

  • 如果路由是 /messages 如果使用 indexAction() 路由到 Controller 别名 messages-controller-index
  • 如果路由是/messages/types,它会停留在controller-alias messages-controller-index,但会转到typesAction()<
  • 如果路由是 /tasks 如果使用 indexAction() 路由到 Controller 别名 tasks-controller-index
  • 如果路由是/tasks/types,它将停留在controller-alias tasks-controller-index,但转到typesAction() <

您显然可以更改 Controller 别名及其背后的含义。如果您想为 /messages/types/1 之类的路由添加 ID,您可以为 segment 类型的 types-route 构建一个子路由> 并检查 [:id] 参数,其约束应该是数字:) 检查官方 ZF2 手册以获取更多信息,我现在很懒:P

关于rest - zf2 中不同模块中的相同 Controller 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13584136/

相关文章:

api - 在 REST API 中寻址 "chattiness"

java - 如何在JPA中不检索 parent 信息

session - ZF2中如何实现鉴权

git - 无法使用git推送以下教程

zend-framework2 - ZF2 : How to set form elements to be ignored?

c# - 使用 jQuery 调用 put 方法时出现 WCF 内部服务器错误

HTTP 选项 - 不可缓存?

node.js - MongoDB + NodeJS : MapReduce or manual calculation

php - 如何清除 Zend framework2 中的 session 容器

php - 将 pdf 与 zendpdf 合并