【问题标题】:How to change namespace in Symfony2如何在 Symfony2 中更改命名空间
【发布时间】:2015-09-21 13:49:34
【问题描述】:

我正在使用 Symfony 2.6

我的主要包是 AppBundle,所以包中的所有命名空间如下所示:

AppBundle\目录名称

我想更改所有命名空间,以便最终得到如下内容:

MyCompanyName\ProjectName\AppBundle\DirectoryName

================================================ =========

接下来的文字显示了我尝试过的内容以及我遇到的错误。

我有 StringUtilities 类:

<?php

namespace MyCompanyName\ProjectName\AppBundle\Utility;

class StringUtilities {

}

我在这里使用 StringUtilities:

<?php

namespace AppBundle\Auth;

use MyCompanyName\ProjectName\AppBundle\Utility\StringUtilities as SU;

class UserChecker extends \Symfony\Component\Security\Core\User\UserChecker {
}

运行应用程序时,我收到此错误:

尝试从命名空间加载类“StringUtilities” “MyCompanyName\ProjectName\AppBundle\Utility”。你忘了一个“使用” 另一个命名空间的声明?

通过在 app/autoload.php 中添加这一行来解决这个问题

$loader->addPsr4('MyCompanyName\ProjectName\\', realpath(__DIR__.'/../src'));

现在我尝试更改 UseChecker 类的命名空间:

<?php

namespace MyCompanyName\ProjectName\AppBundle\Auth;

use MyCompanyName\ProjectName\AppBundle\Utility\StringUtilities as SU;

class UserChecker extends \Symfony\Component\Security\Core\User\UserChecker {
}

当我尝试通过控制台清除缓存时(php app/console cache:clear),我得到了这个错误:

[运行时异常]
自动加载器预期类“AppBundle\Auth\UserChecker”为 在文件中定义 “/home/damjan/Temp/licence-management/src/AppBundle/Auth/UserChecker.php”。 找到文件但类不在其中,类名或 命名空间可能有错字。

在浏览器中运行应用程序时,我收到此错误:

UserChecker.php 第 0 行中的 FatalErrorException:编译错误:不能 重新声明类 MyCompanyName\ProjectName\AppBundle\Auth\UserChecker

【问题讨论】:

  • 我没有完整的答案给你。关于 Attempted to load class "StringUtilities" from namespace ,您将在课堂内使用 StringUtilities 。而不是 SU 。搜索并更改为SU而不是使用声明。
  • RuntimeException 错误是不言自明的。我想。仔细看..你需要改变什么?
  • @HariKT SU 在代码中使用,问题不存在。如果我尝试更改命名空间,我会在任何类的捆绑包中出现类似这两个的错误。至于控制台的RuntimeException,我把异常的所有文字都贴出来了。
  • 删除在 AppKernel 上注册的包并修复更改并再次添加包。这应该可行。

标签: php symfony namespaces


【解决方案1】:

我想绕过 Sumfony 规则并不是那么容易和干净:

捆绑目录结构用作命名空间层次结构。

所以我决定也重命名 appBundle。这是我所做的:

  • 我在src中创建了子文件夹并命名为MyCompanyName
  • 我在其中移动了 AppBundle 文件夹并将其重命名为 ProjectNameBundle
  • 比我使用 find replace 更改所有命名空间

    AppBundle -> MyCompanyName\ProjectNameBundle

更改时要小心,因为单词 AppBundle 并不总是在类路径(命名空间)中,它也可以是目录路径的一部分。例如,在 config.yml 我做了这个改变:

我改变了这个:

orm:
    mappings:
        CompanyManagementBundle:
            type: annotation
            dir: %kernel.root_dir%/../src/AppBundle/Entity
            prefix: AppBundle\Entity
            alias: AppBundle

进入这个:

orm:
    mappings:
        CompanyManagementBundle:
            type: annotation
            dir: %kernel.root_dir%/../src/MyCompanyName/ProjectNameBundle/Entity
            prefix: MyCompanyName\ProjectNameBundle\Entity
            alias: ProjectNameBundle

在 routing.yml 我改变了这个:

app:
    resource: "@AppBundle/Controller/"
    type:     annotation

进入这个:

company_management:
    resource: "@ProjectNameBundle/Controller/"
    type:     annotation

重点是:重命名时要小心。

【讨论】:

    【解决方案2】:

    在 composer 中更改您的自动加载,然后运行 ​​composer dump-autoload

    之后更改您的命名空间包和您的 AppKernel 并开心。

    【讨论】:

    • 不知道为什么这被否决了,因为这是我在将默认捆绑包重命名为自定义名称时未能更新的一步。谢谢你holodoc!
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多