Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Finally I have things riding on wheels, thanks to Fluency Dev Team for give me a north. The guys found a solution touching Doctrine\DBAL\Schema\Visitor\CreateSchemaSqlCollector to fix creation of schemas. There is a beautiful TODO from Doctrine Team. Now the cache problem was solved trough harcode hacking on Doctrine\Common\Annotations\FileCacheReader. I prefer keep my hands off from Sensio and Doctrine code and there is my final solution until Doctrine make required fixes, cause i 'can't work on GitHub due to Internet limitations:</p> <p>services.xml</p> <pre><code>&lt;?xml version="1.0" ?&gt; &lt;container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"&gt; &lt;parameters&gt; &lt;parameter key="fluency.framework.loadclassmetadata.listener.class"&gt;Fluency\Bundle\FrameworkBundle\EventListener\LoadClassMetadataListener&lt;/parameter&gt; &lt;parameter key="fluency.framework.schemacreatetable.listener.class"&gt;Fluency\Bundle\FrameworkBundle\EventListener\SchemaCreateTableListener&lt;/parameter&gt; &lt;/parameters&gt; &lt;services&gt; &lt;service id="fluency.framework.loadclassmetadata.listener" class="%fluency.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; &lt;service id="fluency.framework.schemacreatetable.listener" class="%fluency.framework.schemacreatetable.listener.class%"&gt; &lt;tag name="doctrine.event_listener" event="onSchemaCreateTable" method="onSchemaCreateTable"/&gt; &lt;call method="setContainer"&gt;&lt;argument type="service" id="service_container" /&gt;&lt;/call&gt; &lt;/service&gt; &lt;/services&gt; &lt;/container&gt; </code></pre> <p>LoadClassMetadataListener.php</p> <pre><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) { if (!$this-&gt;container-&gt;get('database_connection')-&gt;getDatabasePlatform()-&gt;supportsSchemas()) { $classMetadata = $args-&gt;getClassMetadata(); $tableName = $classMetadata-&gt;table['name']; if (strpos($tableName, '.')) { $reflectionClass = $classMetadata-&gt;getReflectionClass(); $hashedName = sha1($reflectionClass-&gt;name); $cacheFileName = strtr($hashedName, '\\', '-') . '.cache.php'; $this-&gt;refreshAnnotationsCache($cacheFileName); $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']; if (strpos($mappedTableName, '.')) { $classMetadata-&gt;associationMappings[$fieldName]['joinTable']['name'] = str_replace('.', '_', $mappedTableName); $cacheFileName = strtr($hashedName, '\\', '-') . '$' . $fieldName . '.cache.php'; $this-&gt;refreshAnnotationsCache($cacheFileName); } } } } } } } /** * @param $cacheFileName */ private function refreshAnnotationsCache($cacheFileName) { $cachePath = $this-&gt;container-&gt;getParameter('kernel.root_dir') . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . $this-&gt;container-&gt;getParameter('kernel.environment') . DIRECTORY_SEPARATOR . 'annotations'; $cacheFilePath = $cachePath . DIRECTORY_SEPARATOR . $cacheFileName; $tableAnnotation = 'Doctrine\\ORM\\Mapping\\Table'; $joinTableAnnotation = 'Doctrine\\ORM\\Mapping\\JoinTable'; $data = include $cacheFilePath; $newData = array(); foreach ($data AS $annotationClass) { if (get_class($annotationClass) == $tableAnnotation OR get_class($annotationClass) == $joinTableAnnotation) { $annotationClass-&gt;name = str_replace('.', '_', $annotationClass-&gt;name); } $newData[] = $annotationClass; } file_put_contents($cacheFilePath, '&lt;?php return unserialize(' . var_export(serialize($newData), true) . ');'); } } </code></pre> <p>With both listeners (remember SchemaCreateTableListener) we can switch between databases platforms without problems with table names. Thank's to Peter Bailey but these pieces of code it's was I talking about it.</p>
    singulars
    1. This table or related slice is empty.
    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.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      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