symfony学说Map

p1tboqfb  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(96)

Symfony 6.3
我想把实体放在多个目录中,现在我有一个这样的配置:

doctrine:
orm:
    auto_generate_proxy_classes: '%kernel.debug%'
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: true
    mappings:
        App\Core:
            is_bundle: false
            type: attribute
            dir: '%kernel.project_dir%/src/Core/Entity'
            prefix: 'App\Core\Entity'
            alias: AppCore
        App\Shared:
            is_bundle: false
            type: attribute
            dir: '%kernel.project_dir%/src/Shared/Entity'
            prefix: 'App\Shared\Entity'
            alias: AppShared
        App\Chat:
            is_bundle: false
            type: attribute
            dir: '%kernel.project_dir%/src/Chat/Entity'
            prefix: 'App\Chat\Entity'
            alias: AppChat
        App\User:
            is_bundle: false
            type: attribute
            dir: '%kernel.project_dir%/src/User/Entity'
            prefix: 'App\User\Entity'
            alias: AppUser

现在,如果我添加一个新的“模块”与实体的子文件夹,我应该添加一个新的配置。
有没有什么方法可以将这个配置应用到MySQL?类似这样:

doctrine:
orm:
    auto_generate_proxy_classes: '%kernel.debug%'
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: true
    mappings:
        App:
            is_bundle: false
            type: attribute
            dir: '%kernel.project_dir%/src/*/Entity'
            prefix: 'App\Entity'
            alias: App

我试着这样做,但它不起作用。

5ssjco0h

5ssjco0h1#

你可以试试下面的配置。我不确定它是否有效,我还没有测试过。

mappings:
    App:
        is_bundle: false
        type: attribute
        dir: '%kernel.project_dir%/src/'
        prefix: 'App'
        alias: App

我不确定其他类和Symfony DI容器内部会发生什么。
另外,不要忘记使用services.yaml文件中的排除列表禁用所有这些位置的自动加载器:

App\:
   exclude:
     - '../src/*/Entity'   // not sure if you can use `**` as glob pattern here
fnatzsnv

fnatzsnv2#

看起来你是按域分割代码。

Core\
Core\Entity\
Shared\
Shared\Entity\
Chat\
Chat\Entity\
User\
User\Entity\

这个架构看起来像旧的Symfony bundle系统,如果你想简化你的symfony配置,你最好把这些目录声明为bundle。
只需添加一个文件和一些配置:
Core\CoreBundle.php

<?php

namespace App\Core;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class CoreBundle extends Bundle
{
}

及其在PHP/PHP中的声明

<?php

return [
    // ...
    App\Core\CoreBundle::class => ['all' => true],
];

从这里开始,将Map配置为bundle,Doctrine将自动在Core\Entity目录中查找实体。

mappings:
    App\Core:
        is_bundle: true
        type: attribute
        alias: AppCore

您可以阅读更多关于bundles here
请注意,Symfony不建议创建捆绑包,除非是可重用的组件。
不要创建任何捆绑包来组织应用程序逻辑
当Symfony 2.0发布时,应用程序使用bundle将其代码划分为逻辑功能:UserBundle,ProductBundle,VirtualBundle等。
如果您需要在项目中重用某些功能,请为其创建一个bundle(在私有存储库中,不要将其公开)。对于应用程序代码的其余部分,请使用PHP命名空间来组织代码,而不是bundle。

lo8azlld

lo8azlld3#

我做了类似的事情--但是我使用了xmlMap。

doctrine:
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: false
        mappings:
            App:
                is_bundle: false
                type: xml
                dir: '%kernel.project_dir%/config/schema/'
                prefix: 'App\Domain'

schema/Order.OrderItem.xml:
<entity name="App\Domain\Order\OrderItem">
schema/Product.Inventory.xml:
<entity name="App\Domain\Product\Inventory">
所以实体名称告诉doctrine在哪里寻找实体类。我不知道它是否会以同样的方式处理注解/属性。(但由于XML有点被doctrine-extensions和XML破坏-我将不得不在不久的将来面对这个问题。)

相关问题