【问题标题】:How rename namespace Application in SonataUserBundle?如何在 SonataUserBundle 中重命名命名空间应用程序?
【发布时间】:2015-03-06 23:53:00
【问题描述】:

我的作曲家文件:

    "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”,我所有的 Bundles 在命名空间“WPE”... 我希望用户包在我的命名空间中。

用户实体重命名为“WPE\UserBundle\Entity\User”,登录,管理员都可以工作,但是 奏鸣曲中的用户列表发送错误 "Class Application\Sonata\UserBundle\Entity\User 不存在"

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

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

【问题讨论】:

  • 确保您已清除缓存
  • 我清除缓存,首先使用“app/console cache:clear”,当我尝试删除文件夹“app/cache/dev/”时,创建缓存时 - 它有“Application\Sonata\UserBundle”,但它只在缓存中,我在“src”或“vendor”文件夹中找不到任何东西......

标签: php symfony sonata-admin


【解决方案1】:
  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: ~
    

【讨论】:

  • 非常感谢!!
【解决方案2】:

解决此问题的实用方法

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

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

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

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

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

您主要需要遵循上一段中的说明:

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

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

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

【讨论】:

  • SonataEasyExtendsBundle 在全局命名空间“Application”中创建新包,我想在我的命名空间“WPE”中...
  • 如果不指定参数,则在app/Application/Sonata...中生成文件...但您可以使用-dest=src指定路径
【解决方案3】:

如果你想使用:

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 (ligne 70 ) 中:

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

4 - 在奏鸣曲项目/资源/骨架/捆绑/bundle.mustache:

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

5 - 在 Sonata\UserBundle\DependencyInjection\SonataUserExtension (ligne 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 中

你的名字空间

你们实体

您的服务

和你的班级管理员

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2013-04-04
    • 2012-01-26
    • 1970-01-01
    • 2018-10-11
    • 2013-06-17
    相关资源
    最近更新 更多