【问题标题】:When is it possible to create two controllers with the same name in Symfony2?什么时候可以在 Symfony2 中创建两个具有相同名称的控制器?
【发布时间】:2016-01-14 08:56:48
【问题描述】:

在具有相同供应商名称的同一项目的不同捆绑包中定义第二个控制器类 PostController 后,我开始出现以下错误。

致命错误:无法重新声明类 Amce\Bundle\CrudzBundle\Controller\PostController 在 C:\xampp\htdocs\community\src\Amce\CrudzBundle\Controller\PostController.php 在第 350 行

我了解此错误意味着我的两个类 (OOP) 具有相同的名称。但是为什么即使我有不同的供应商部分的不同捆绑包,我仍然有这个错误?这是否意味着 Synfony2 不允许在所有情况下拥有两个具有相同名称的控制器类?

我们始终感谢您的专家解释。

【问题讨论】:

  • AFAIK symfony 并没有这样做,并且您不能在同一个命名空间中拥有 2 个具有相同名称的类(或接口或抽象或特征)。 vendor 命名空间和你的命名空间是一样的吗?
  • @mloureiro,我希望我对vendor 的含义没有错,但这里我有Amce 作为供应商,AmceCrudzBundle 作为命名空间。我错了吗?谢谢
  • @mloureiro,但我已经在AmceFruitsBundleShopManagementBundle 有一个同名的控制器,但出现同样的错误

标签: php symfony namespaces


【解决方案1】:

我假设罪魁祸首类的命名空间是:

namespace Amce\Bundle\CrudzBundle\Controller

但是文件路径是:

C:\xampp\htdocs\community\src\Amce\CrudzBundle\Controller\PostController.php 

如果您复制/粘贴了原始类,您可能忘记更改命名空间。

自动加载器会在这个目录中检查一个不存在的类(因为所说的命名空间),但在此之前,它会发现之前完全相同的命名空间/类。

在 PHP 5.3 中,命名空间被合并到类名中。重要的是要记住它们之间没有区别,因为它们是在编译时组合在一起的。

尽管您可以调用__NAMESPACE__ 来获取当前命名空间,但实际上这不是对代码执行动态自省,而是将魔术常量转换为常量字符串编译时间。

类也是如此,命名空间成为类名的一部分,是类在内部引用表中的索引方式。

所以要注意命名空间。

【讨论】:

  • 感谢您指出这可能是复制/粘贴问题,我通过在控制器文件中将namespace Amce\Bundle\CrudzBundle\Controller; 更改为命名空间Amce\CrudzBundle\Controller; 解决了这个问题,现在它正在工作。非常感谢
  • 我不完全理解(诚实)。在我项目的所有控制器中,我使用的是namespace Amce\Bundle\CrudzBundle\Controller;,现在对于这个特定的控制器,我必须从中省略/Bundle? !!真的很奇怪
  • @whitelettersinblankpapers 您可能更改了目录结构。虽然让我感到困惑的是为什么该错误表明该课程在第 350 行。
  • 是的,先生,就是这样。我想我累了,该睡觉了! :-) 祝你有美好的一天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2014-12-28
  • 2014-08-26
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多