如何在 SonataUserBundle 中重命名命名空间应用程序?

How rename namespace Application in SonataUserBundle?

我的作曲家文件:

    "php": ">=5.3.3",
    "symfony/symfony": "2.6.*",
    "doctrine/orm": "~2.2,>=2.2.3",
    "doctrine/doctrine-bundle": "~1.2",
    "twig/extensions": "~1.0",
    "symfony/assetic-bundle": "~2.3",
    "symfony/swiftmailer-bundle": "~2.3",
    "symfony/monolog-bundle": "~2.4",
    "sensio/distribution-bundle": "~3.0",
    "sensio/framework-extra-bundle": "~3.0",
    "incenteev/composer-parameter-handler": "~2.0",
    "friendsofsymfony/user-bundle": "1.3.3",
    "sonata-project/core-bundle": "2.3.*@dev",
    "sonata-project/admin-bundle": "2.4.*@dev",
    "sonata-project/doctrine-orm-admin-bundle" : "*",
    "sonata-project/easy-extends-bundle": "2.1.*@dev",
    "sonata-project/user-bundle": "~2.2",
    "knplabs/knp-menu-bundle": "~1.1",
    "hwi/oauth-bundle": "~0.4@dev",
    "sonata-project/cache-bundle": "~2.2"

如果我使用 "php app/console sonata:easy-extends:generate -d src/ SonataUserBundle" - 命令生成命名空间 "Application",我所有的 Bundle 都在命名空间 "WPE" 中... 我想要我的命名空间中的用户包。

用户实体重命名为 "WPE\UserBundle\Entity\User"、登录、管理员都可以,但是 奏鸣曲中的用户列表发送错误"Class Application\Sonata\UserBundle\Entity\User does not exist"

我在缓存文件和奏鸣曲文档中找到(在路径中查找...在 IDE PhpStorm 中)"Application\Sonata\UserBundle"。

如何使用我的命名空间 "WPE"?

解决这个问题的实用方法

解决此问题的最简单方法是在 VB 中使用全局命名空间,全局命名空间是唯一允许的命名空间 Application\YourBundle\Entity.

因此,在您的映射定义或 VB 代码中,您将使用一个最终命名空间:问题已解决。如何实现:

仅在 VB 中声明超类,不要使用最终实体, 调用您的实体 BaseXXXX 并将其抽象化,将属性从私有更改为受保护, 存储库也是如此, 始终在代码中使用 Application\YourBundle\Entity\XXXX。 当然,您需要为每个 VB 包创建:

Application 目录中的有效结构, 一个有效的实体映射定义, 实体文件夹中的模型。 如果没有有效的工具为您生成此结构,最后一部分是非常低效的:EasyExtendsBundle 来拯救。

如何使您的捆绑包易于扩展?

主要是您需要按照上一段中的说明进行操作:

声明你 entity/repository 如上所述, 如上所述使用您的 entity/repository, 在生成之前,您还需要描述 AB 实体的“骨架”文件。骨架文件可以是 xml 或 yml。有关完整的工作示例,请参阅 SonataMediaBundle。 最后你可以 运行:

php app/console sonata:easy-extends:generate YourVBBundleName

请注意,–dest 选项允许您选择目标目录,例如 src。默认目标是 app/.

如果你想使用:

php app/console sonata:easy-extends:generate YourVBBundleName

您可以修改一些 SonataAdmin 字段,这不是最好的方法,但可以帮助您 运行 至少命令并生成您的包:

1 - 在 Sonata\EasyExtendsBundle\Bundle\BundleMetadata (ligne 95) 中进行如下更改:

 $this->extendedNamespace = sprintf('WPE\%s\%s', $this->vendor, $information[1]);

2 - 在 Sonata\EasyExtendsBundle\Command\GenerateCommand(第 67 行)中:

            'application_dir' =>  sprintf("%s/WPE", $dest)

3 - 在 Sonata\EasyExtendsBundle\Generator\BundleGenerator(70 线)中:

        $file = sprintf('%s/WPE%s.php', $bundleMetadata->getExtendedDirectory(), $bundleMetadata->getName());

4 - 在 sonata-project / Resources / skeleton / bundle / bundle.mustache :

class WPE{{ bundle }} extends Bundle
{
 /.../
}

5 - 在 Sonata\UserBundle\DependencyInjection\SonataUserExtension(162/163 线)中:

 $defaultConfig['class']['user']  = sprintf('WPE\Sonata\UserBundle\%s\User', $modelType);

 $defaultConfig['class']['group'] = sprintf('WPE\Sonata\UserBundle\%s\Group', $modelType);

然后运行 php app/console sonata:easy-extends:generate.

您可以通过其他方式复制 WPE 下的 UserBundle 并进行更改:

在config.yml

你的名字空间

你们实体

您的服务

和您的 class 管理员

  1. Application\Sonata\UserBundle 重命名为您的 YourVendor\UserBundle\Entity\User
  2. 将所有文件中的 Application\Sonata\UserBundle... 命名空间重命名为 YourVendor\UserBundle\...
  3. Appkernel.php 中删除新的 Application\Sonata\UserBundle\ApplicationSonataUserBundle() 并在 AppKernel.php 中添加 YourVendor\UserBundle()
  4. 更改配置:

    sonata_user:
         #security_acl: true # Uncomment for ACL support
         manager_type: orm # can be orm or mongodb
         class:
            user:               YourVendor\UserBundle\Entity\User
            group:              YourVendor\UserBundle\Entity\Group
    fos_user:
         db_driver:  orm # can be orm or odm
         firewall_name:  main
         user_class:  YourVendor\UserBundle\Entity\User
         #user_class: Application\Sonata\UserBundle\Entity\User
         group:
           group_class:  YourVendor\UserBundle\Entity\Group
           #group_class: Application\Sonata\UserBundle\Entity\Group
           group_manager: sonata.user.orm.group_manager
         service:
           user_manager: sonata.user.orm.user_manager
    
  5. 如果您使用的是 orm 映射:

    mappings:
         YourVendorUserBundle: ~
         #ApplicationSonataUserBundle: ~