如何更改Symfony2

时间:2015-07-03 17:08:00

标签: php symfony namespaces

我正在使用Symfony 2.6

我的主要包是AppBundle,因此bundle中的所有命名空间都是这样的:

  

的appbundle \目录名

我想更改所有名称空间,以便最终得到类似的内容:

  

MyCompanyName \项目名\的appbundle \目录名

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

下一个文字显示了我的尝试以及我遇到的错误。

我有类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 {
}

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

  

尝试加载类&#34; StringUtilities&#34;从命名空间   &#34; MyCompanyName \项目名\的appbundle \实用&#34 ;.你忘记了&#34;使用&#34;   另一个命名空间的语句?

通过在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)时,我收到此错误:

  

[RuntimeException的]
  自动加载器预期类&#34; AppBundle \ Auth \ UserChecker&#34;成为   在文件中定义   &#34; /home/damjan/Temp/licence-management/src/AppBundle/Auth/UserChecker.php" ;.   找到了该文件,但该类不在其中,类名或   命名空间可能有拼写错误。

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

  

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

  

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

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

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

    AppBundle - &gt; 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

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