Php 条令实体标注中的Symfony参数

Php 条令实体标注中的Symfony参数,php,symfony,doctrine,Php,Symfony,Doctrine,我有一个实体使用的数据库与默认连接使用的数据库不同,因此我在实体的注释中添加了: /** * MyClassName * * @ORM\Table(name="mytable", schema="`myschema`") * @ORM\Entity(repositoryClass="App\...\MyClassNameRepository") */ class MyClassName { ... 这是工作 但我

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

        /**
     * MyClassName
     *
     * @ORM\Table(name="mytable", schema="`myschema`")
     * @ORM\Entity(repositoryClass="App\...\MyClassNameRepository")
     */
    class MyClassName
    {
...
这是工作

但我想这样设置模式:

schema="`%myapp.specificschema%`" 
我之所以要这样做,是因为我想在生产和环境中设置不同的数据库名称,并且我只想在一个文件中更改此参数一次。 但这似乎是不可能的,因为条令无法访问参数


提前感谢您的回复

您可以使用Doctrine loadMetadata事件修改架构。

例如,对于订户模式,我们应该有如下内容:

参数。yml

parameters:
    schema_name: "my_schema_name"
services.yml

doctrine.schema_name.subscriber:
    class: App\Doctrine\SchemaDoctrineSubscriber
    arguments: ["%schema_name%"]
    tags:
        - { name: doctrine.event_subscriber, connection: default }
和相应的类:

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;

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;
        }
    }
}

然后,您只需将注释中的
模式
属性保留为空,事件将在其上设置好的值。

从n3k answer升级到管理AssociationMappings

--实体--

--SchemadToctrineSubscriber--

!!getEnvSchemaName()用于快速管理架构名称

<?php

namespace AppBundle\Doctrine ;


use Doctrine\Common\EventSubscriber ;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs ;





/**
 * 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

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

您能给我们看一下您的配置文件config.ymlI我想您必须从注释切换到xmlI我已经测试了xml而不是注释,它没有更好地工作。。。可能我应该使用另一个实体经理,但这是一项工作…Bof,没有更好的工作…@Coolhand,正如您在删除的邮件中指出的,我的答案有效,请接受它;)对我来说,遵循这个代码之后。架构仍然没有更改。但在通过注释手动设置后,更改模式成功。。在检查内部
$classMetadata
后,架构被更改,但它在我的symfony上不起作用。
# Permet de modifier les noms des tables (schemas) depuis les paramètres
doctrine.schema_name.subscriber:
    class: AppBundle\Doctrine\SchemaDoctrineSubscriber
    arguments: ["%databases.primary.schema.name%", "%databases.secondary.schema.name%"]
    tags:
        - { name: doctrine.event_subscriber, connection: **main_connection** }
parameters:
    databases.primary.schema.name:      **primary_schema_name**
    databases.secondary.schema.name:      **secondary_schema_name**