gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:22:12 25 4
gpt4 key购买 nike

我今天刚刚发现 zf2 并不喜欢两个 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 错误。
Tasks 模块的 module.config.php 是相同的,但用于任务。
我最初有别名,但是在我在某个地方读到这不是很推荐之后我删除了它们。

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

任何人都知道如何使我的 2 url 工作?

谢谢 :)

最佳答案

可调用或服务的别名以及其他任何东西都应该是唯一的。如果它们不是唯一的,则它们可能会按照模块本身的加载顺序被另一个模块覆盖。这意味着:在设置可调用对象或任何类型的别名时,请确保别名为 独一无二的有意义的 .我个人这样命名我的 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 if 路由到 Controller 别名 messages-controller-indexindexAction()
  • 如果路线是 /messages/types它停留在 Controller 别名 messages-controller-index但转到 typesAction()
  • 如果路线是 /tasks if 路由到 Controller 别名 tasks-controller-indexindexAction()
  • 如果路线是 /tasks/types它停留在 Controller 别名 tasks-controller-index但转到 typesAction()

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

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com