如何在Symfony2中更改命名空间


How to change namespace in Symfony2

我正在使用Symfony 2.6

我的主捆绑包是AppBundle,所以捆绑包中的所有名称空间看起来都是这样的:

AppBundle''DirectoryName

我想更改所有的名称空间,这样我就可以得到这样的东西:

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

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

在那之后,更改您的命名空间捆绑包和AppKernel,并感到高兴。

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

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

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

  • 我在src中制作了子文件夹,并将其命名为CCD_
  • 在其中,我移动了AppBundle文件夹并将其重命名为ProjectNameBundle
  • Than我用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

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