学说实体注释中的符号参数



我有一个实体使用与默认连接使用的数据库不同的数据库,因此我在实体的注释中放置了:

        /**
     * MyClassName
     *
     * @ORMTable(name="mytable", schema="`myschema`")
     * @ORMEntity(repositoryClass="App...MyClassNameRepository")
     */
    class MyClassName
    {
...

这是工作。

但我想像这样设置模式:

schema="`%myapp.specificschema%`" 
我想

这样做是因为我想在生产环境中设置一个不同的数据库名称,并且我只想在一个文件中更改此参数一次。但这似乎是不可能的,因为教义无法访问参数......

提前感谢您的任何回复!

从 n3k 答案升级以管理关联映射

--实体--

/**
 * @ORMTable(schema="primary", name="**table_entity_name**", ...)
 * @ORMEntity
 */
class Entity
{
       /**
        * @ORMManyToMany(targetEntity="**pathToEntityManyToMany**" ...)
        * @ORMJoinTable(
        *      schema="secondary",
        *      name="**table_field_name**",
        *      joinColumns={@ORMJoinColumn(name="fk_join_***", referencedColumnName="id")},
        *      inverseJoinColumns={@ORMJoinColumn(name="fk_inverse_***", referencedColumnName="id")}
        * )
        */
    private $fieldManyToMany ;
}
--

SchemaDoctrineSubscriber --

!! getEnvSchemaName(( 用于快速管理模式名称

<?php
namespace AppBundleDoctrine ;

use DoctrineCommonEventSubscriber ;
use DoctrineORMEventLoadClassMetadataEventArgs ;


/**
 * Permet de modifier les noms des tables (schemas) depuis les paramètres
 */
class SchemaDoctrineSubscriber implements EventSubscriber
{
    /**
     * Nom des schemas
     *
     * string
     */
    private $schema_primary ;
    private $schema_secondary ;


    /**
     *
     * @param string $schema_primary
     * @param string $schema_secondary
     */
    public function __construct($schema_primary, $schema_secondary)
    {
        $this->schema_primary   = $schema_primary ;
        $this->schema_secondary = $schema_secondary ;
    }

    /**
     * @inheritdoc
     */
    public function getSubscribedEvents()
    {
        return ['loadClassMetadata'] ;
    }

    /**
     * @param LoadClassMetadataEventArgs $eventArgs
     */
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
    {
        $classMetadata = $eventArgs->getClassMetadata() ;
        // Modifie les schemas des AssociationMappings de l'entité
        foreach ($classMetadata->getAssociationMappings() as $key => $associationMapping)
            if (isset($associationMapping['joinTable']))
            {
                $associationMapping['joinTable']['schema'] = $this->getEnvSchemaName($classMetadata->getSchemaName()) ;
                $classMetadata->setAssociationOverride($key, $associationMapping) ;
            }
        // Modifie le schema  de l'entité
        $classMetadata->table['schema'] = $this->getEnvSchemaName($classMetadata->getSchemaName()) ;
    }

    /**
     * Retourne le nom du schema de l'environnement
     *
     * @param string $classMetadataSchemaName
     *
     * @return string
     */
    private function getEnvSchemaName($classMetadataSchemaName)
    {
        switch ($classMetadataSchemaName)
        {
            case 'primary':
                return $this->schema_primary ;
            case 'secondary':
                return $this->schema_secondary ;
        }
    }
}

服务.yml

# Permet de modifier les noms des tables (schemas) depuis les paramètres
doctrine.schema_name.subscriber:
    class: AppBundleDoctrineSchemaDoctrineSubscriber
    arguments: ["%databases.primary.schema.name%", "%databases.secondary.schema.name%"]
    tags:
        - { name: doctrine.event_subscriber, connection: **main_connection** }

参数.yml

parameters:
    databases.primary.schema.name:      **primary_schema_name**
    databases.secondary.schema.name:      **secondary_schema_name**

您可以使用 Doctrine loadMetadata Event 修改架构。
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#load-classmetadata-event

例如,对于订阅者模式,我们应该有这样的东西:

参数.yml

parameters:
    schema_name: "my_schema_name"

服务.yml

doctrine.schema_name.subscriber:
    class: AppDoctrineSchemaDoctrineSubscriber
    arguments: ["%schema_name%"]
    tags:
        - { name: doctrine.event_subscriber, connection: default }

和相应的类:

use DoctrineCommonEventSubscriber;
use DoctrineORMEventLoadClassMetadataEventArgs;
class SchemaDoctrineSubscriber implements EventSubscriber
{
    /** @var string */
    private $schemaName;
    /**
     * SchemaDoctrineSubscriber constructor.
     * @param string $schemaName
     */
    public function __construct(string $schemaName)
    {
        $this->schemaName = $schemaName;
    }
    /**
     * @inheritdoc
     */
    public function getSubscribedEvents()
    {
        return array(
            'loadClassMetadata',
        );
    }
    /**
     * @param LoadClassMetadataEventArgs $eventArgs
     */
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
    {
        $classMetadata = $eventArgs->getClassMetadata();
        if ($classMetadata->getTableName() === 'mytable') {
            $classMetadata->table['schema'] = $this->schemaName;
        }
    }
}

然后,您可以在注释中将schema属性留空,事件将在其上设置良好的值。

最新更新