Note that there are some explanatory texts on larger screens.

plurals
  1. POSymfony2 entity metadata caching?
    primarykey
    data
    text
    <p>Finding a solution for reusing entity annotations between different database platforms I reach this:<br> I have a solution for rename tableName on entity classes metadata listening loadClassMetada event:</p> <p>My services.xml</p> <pre class="lang-xml prettyprint-override"><code>&lt;service id="framework.loadclassmetadata.listener" class="%framework.loadclassmetadata.listener.class%"&gt; &lt;tag name="doctrine.event_listener" event="loadClassMetadata" method="loadClassMetadata"/&gt; &lt;call method="setContainer"&gt;&lt;argument type="service" id="service_container" /&gt;&lt;/call&gt; &lt;/service&gt; </code></pre> <p>My Listener class:</p> <pre class="lang-php prettyprint-override"><code>&lt;?php namespace Fluency\Bundle\FrameworkBundle\EventListener; use Doctrine\ORM\Event\LoadClassMetadataEventArgs; use Doctrine\ORM\Mapping\ClassMetadataInfo; use Symfony\Component\DependencyInjection\ContainerAware; /** * Class LoadClassMetadataListener * * @package Fluency\Bundle\FrameworkBundle\EventListener */ class LoadClassMetadataListener extends ContainerAware { /** * @param LoadClassMetadataEventArgs $args */ public function loadClassMetadata(LoadClassMetadataEventArgs $args) { $connection = $this-&gt;container-&gt;get('database_connection'); $classMetadata = $args-&gt;getClassMetadata(); if(!$connection-&gt;getDatabasePlatform()-&gt;supportsSchemas()) { $tableName = $classMetadata-&gt;table['name']; $classMetadata-&gt;table['name'] = str_replace('.', '_', $tableName); foreach ($classMetadata-&gt;getAssociationMappings() as $fieldName =&gt; $mapping) { if ($mapping['type'] == ClassMetadataInfo::MANY_TO_MANY) { if(isset($classMetadata-&gt;associationMappings[$fieldName]['joinTable']['name'])) { $mappedTableName = $classMetadata-&gt;associationMappings[$fieldName]['joinTable']['name']; $classMetadata-&gt;associationMappings[$fieldName]['joinTable']['name'] = str_replace('.', '_', $mappedTableName); } } } } } } </code></pre> <p>And a solution for create schemas on database platforms like postgresql:</p> <pre class="lang-php prettyprint-override"><code>&lt;?php namespace Fluency\Bundle\FrameworkBundle\EventListener; use Doctrine\DBAL\DBALException; use Doctrine\DBAL\Event\SchemaCreateTableEventArgs; use Symfony\Component\DependencyInjection\ContainerAware; /** * Class SchemaCreateTableListener * * @package Fluency\Bundle\FrameworkBundle\EventListener */ class SchemaCreateTableListener extends ContainerAware { /** * @var array */ private $_createdSchemas = array(); /** * @param SchemaCreateTableEventArgs $args */ public function onSchemaCreateTable(SchemaCreateTableEventArgs $args) { $connection = $this-&gt;container-&gt;get('database_connection'); if ($args-&gt;getPlatform()-&gt;supportsSchemas()) { $tableName = $args-&gt;getTable()-&gt;getName(); $separetedTableName = explode('.', $tableName); if (count($separetedTableName) == 2) { $schemaName = $separetedTableName[0]; if (!in_array($schemaName, $this-&gt;_createdSchemas)) { try { $connection-&gt;exec(sprintf("CREATE SCHEMA %s", $schemaName)); } catch (DBALException $e) { } $this-&gt;_createdSchemas[] = $schemaName; } } } } } </code></pre> <p>All works fine but I think that it's not optimal cause on every time I need class metadata the eventlistener is called by the main entity and each related entity. I though a dirty solution with a command changing annotations by the hard way, reading Entities and replacing tablenames using regexp. (file_get_contents, regexp replacement and file_put_contents)... but don't like me.</p> <p><strong>My question (finally) is if its possible, when symfony2-doctrine2 generates annotations cache and or proxy classes, set the correct tableName?</strong> then my entities code remains without change and loadClassMetadata method logic it's called only when cache it's generated.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload