Commit ceff2c34 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Réorganisation de la config : extraction de config/postgresql.config.php et...

Réorganisation de la config : extraction de config/postgresql.config.php et nouvelle clé 'code_generators_factories'.
parent a2fc30e8
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -2,11 +2,12 @@

namespace UnicaenDbImport;

use Zend\Config\Factory as ConfigFactory;
use Zend\Console\Adapter\AdapterInterface;
use Zend\Console\Console;
use Zend\ModuleManager\Feature\ConsoleUsageProviderInterface;
use Zend\Mvc\Application;
use Zend\Mvc\MvcEvent;
use Zend\Stdlib\Glob;

class Module implements ConsoleUsageProviderInterface
{
@@ -19,7 +20,9 @@ class Module implements ConsoleUsageProviderInterface

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
        $paths = Glob::glob(__DIR__ . '/config/{,*.}{config}.php', Glob::GLOB_BRACE);

        return ConfigFactory::fromFiles($paths);
    }

    public function getAutoloaderConfig()
+23 −39
Original line number Diff line number Diff line
@@ -602,31 +602,37 @@ synchronisation. De nouvelles fonctionnalités à venir devraient pouvoir automa
Développement
-------------

### Supporter une autre plateforme de base de données
### Supporter une plateforme de base de données supplémentaire

Imaginons que l'on veuille ajouter la possibilité d'importer/synchroniser vers la plateforme de base de données
destination MySQL. 

Voici ce qu'il faudra faire :

- Ajouter dans le fichier `config/module.config.php` la config permettant d'associer la bonne classe de "code generator"
  (à créer) à chaque classe de plateforme de base de données MySQL connue de Doctrine :
- Ajouter un fichier de config `config/mysql.config.php` dans lequel sera spécifié :
  - la classe de "code generator" à utiliser en fonction de la plateforme de base de données MySQL ;
  - la factory à utiliser pour instancier le "code generator" en question.

    Exemple :
    
    ```php
    return [
        'import' => [
        'code_generators' => [
            'code_generators_mapping' => [
                \Doctrine\DBAL\Platforms\MySqlPlatform::class   => \UnicaenDbImport\CodeGenerator\MySQL\CodeGenerator::class,
                \Doctrine\DBAL\Platforms\MySQL57Platform::class => \UnicaenDbImport\CodeGenerator\MySQL\CodeGenerator::class,
                \Doctrine\DBAL\Platforms\MySQL80Platform::class => \UnicaenDbImport\CodeGenerator\MySQL\CodeGenerator::class,
            ],
            'code_generators_factories' => [
                \UnicaenDbImport\CodeGenerator\MySQL\CodeGenerator::class => \UnicaenDbImport\CodeGenerator\MySQL\CodeGeneratorFactory::class,
            ],
            //...
        ],
    ];
    ```

- Créer un répertoire `src/UnicaenDbImport/CodeGenerator/MySQL` dans lequel on va créer les fichiers/classes 
  suivants :
- Créer un sous-répertoire `MySQL` dans le répertoire `src/UnicaenDbImport/CodeGenerator` dans lequel il faudra créer 
  les fichiers/classes suivants :

    ```
    .
@@ -640,9 +646,10 @@ return [
    └── MySQLCommonsTrait.php
    ```

- La classe `CodeGenerator` doit *obligatoirement* :
- Respecter les contraintes suivantes dans la classe `CodeGenerator` :
  - hériter de la classe abstraite `\UnicaenDbImport\CodeGenerator\CodeGenerator` ;
  - instancier dans le constructeur ses propres versions MySQL des "helpers" de génération de code (`MySQLTableHelper`, etc.)
  - instancier dans le constructeur ses propres versions MySQL des "helpers" de génération de code 
    (`MySQLTableHelper`, etc.)

    Exemple :
    
@@ -706,12 +713,12 @@ class CodeGenerator extends \UnicaenDbImport\CodeGenerator\CodeGenerator
    }
    ```

- Sa factory `CodeGeneratorFactory` doit *obligatoirement* :
- Respecter les contraintes suivantes dans la factory `CodeGeneratorFactory` :
  - injecter dans le "code generator" une instance de la plateforme correspondant à la base de données destination.
  
    *NB: l'instance de la plateforme de base de données injectée ici est utilisée pour générer du SQL compris par 
    la base de données destination. Si aucune classe de platforme ne correspond exactement à la version de la base 
    de données destination, prenez la générique (`MySqlPlatform` dans notre exemple)*
    de données destination, prenez la plus générique (`MySqlPlatform` dans notre exemple)*

    Exemple :
    
@@ -735,11 +742,10 @@ class CodeGeneratorFactory
    }
    ```


- La classe de "helper" de génération de code `Helper\DiffViewHelper` doit :
  - *obligatoirement* hériter de la classe abstraite `\UnicaenDbImport\CodeGenerator\Helper\DiffViewHelper` ;
  - *obligatoirement* définir les méthodes non implémentées par la classe mère ;
  - *si besoin* redéfinir les méthodes de la classe mère qui ne génèreraient pas du code SQL valide pour la
- Respecter les contraintes suivantes dans la classe de "helper" de génération de code `Helper\DiffViewHelper` :
  - hériter *obligatoirement* de la classe abstraite `\UnicaenDbImport\CodeGenerator\Helper\DiffViewHelper` ;
  - définir *obligatoirement* les méthodes non implémentées par la classe mère ;
  - redéfinir *si besoin* les méthodes de la classe mère qui ne génèreraient pas du code SQL valide pour la
    plateforme de base de données (ici, MySQL).

    ```php
@@ -792,27 +798,5 @@ class DiffViewHelper extends \UnicaenDbImport\CodeGenerator\Helper\DiffViewHelpe
    }
    ```


- Mêmes principes pour les autres classes `Helper\LogTableHelper`, `Helper\TableHelper`, `Helper\TableValidationHelper`.


- Du fait que les classes `CodeGenerator` et `*Helper` héritent déjà chacune d'une classe, un trait `MySQLCommonsTrait` 
  peut être utile pour partager des éléments identiques nécessaires dans toutes ces classes.
  
Exemple pour la plateforme PostgreSQL :

```php
namespace UnicaenDbImport\CodeGenerator\PostgreSQL;

trait PostgreSQLCommonsTrait
{
    /**
     * @param string $argument
     * @return string
     */
    protected function getQuoteLiteralFunctionCallSQLSnippet($argument)
    {
        return 'quote_literal(' . $argument . ')';
    }
}
```
- Respecter les mêmes contraintes dans les autres classes `Helper\LogTableHelper`, `Helper\TableHelper`, 
  `Helper\TableValidationHelper`.
+2 −13
Original line number Diff line number Diff line
@@ -2,12 +2,6 @@

namespace UnicaenDbImport;

use Doctrine\DBAL\Platforms\PostgreSQL100Platform;
use Doctrine\DBAL\Platforms\PostgreSQL91Platform;
use Doctrine\DBAL\Platforms\PostgreSQL92Platform;
use Doctrine\DBAL\Platforms\PostgreSQL94Platform;
use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
use UnicaenDbImport\CodeGenerator\PostgreSQL\CodeGenerator as PostgreSQLCodeGenerator;
use UnicaenDbImport\Config\Config;
use UnicaenDbImport\Config\ConfigFactory;
use UnicaenDbImport\Controller\ConsoleControllerFactory;
@@ -27,13 +21,8 @@ use UnicaenDbImport\Service\SynchroServiceFactory;
return [
    'import' => [
        'connections' => [],
        'code_generators' => [
            PostgreSqlPlatform::class    => PostgreSQLCodeGenerator::class,
            PostgreSQL91Platform::class  => PostgreSQLCodeGenerator::class,
            PostgreSQL92Platform::class  => PostgreSQLCodeGenerator::class,
            PostgreSQL94Platform::class  => PostgreSQLCodeGenerator::class,
            PostgreSQL100Platform::class => PostgreSQLCodeGenerator::class,
        ],
        'code_generators_mapping' => [],
        'code_generators_factories' => [],
        'imports' => [],
        'synchros' => [],
    ],
+33 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenDbImport;

use Doctrine\DBAL\Platforms\PostgreSQL100Platform;
use Doctrine\DBAL\Platforms\PostgreSQL91Platform;
use Doctrine\DBAL\Platforms\PostgreSQL92Platform;
use Doctrine\DBAL\Platforms\PostgreSQL94Platform;
use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
use UnicaenDbImport\CodeGenerator\PostgreSQL\CodeGenerator;
use UnicaenDbImport\CodeGenerator\PostgreSQL\CodeGeneratorFactory;
use UnicaenDbImport\Config\Config;

return [
    'import' => [
        /**
         * @see Config::getCodeGeneratorsMappingConfig()
         */
        'code_generators_mapping' => [
            PostgreSqlPlatform::class    => CodeGenerator::class,
            PostgreSQL91Platform::class  => CodeGenerator::class,
            PostgreSQL92Platform::class  => CodeGenerator::class,
            PostgreSQL94Platform::class  => CodeGenerator::class,
            PostgreSQL100Platform::class => CodeGenerator::class,
        ],
        /**
         * @see Config::getCodeGeneratorsFactoriesConfig()
         */
        'code_generators_factories' => [
            CodeGenerator::class => CodeGeneratorFactory::class,
        ],
    ],
];
+31 −6
Original line number Diff line number Diff line
@@ -16,7 +16,13 @@ class Config
     * platform's class => code generator's class
     * @var array
     */
    protected $codeGeneratorsConfig = [];
    protected $codeGeneratorsMappingConfig = [];

    /**
     * code generator's class => factory's class
     * @var array
     */
    protected $codeGeneratorsFactoriesConfig = [];

    /**
     * @var ImportInterface[]
@@ -29,12 +35,12 @@ class Config
    protected $synchros = [];

    /**
     * @param array $codeGeneratorsConfig
     * @param array $codeGeneratorsMappingConfig
     * @return Config
     */
    public function setCodeGeneratorsConfig(array $codeGeneratorsConfig): Config
    public function setCodeGeneratorsMappingConfig(array $codeGeneratorsMappingConfig): Config
    {
        $this->codeGeneratorsConfig = $codeGeneratorsConfig;
        $this->codeGeneratorsMappingConfig = $codeGeneratorsMappingConfig;

        return $this;
    }
@@ -42,9 +48,28 @@ class Config
    /**
     * @return array
     */
    public function getCodeGeneratorsConfig(): array
    public function getCodeGeneratorsMappingConfig(): array
    {
        return $this->codeGeneratorsMappingConfig;
    }

    /**
     * @return array
     */
    public function getCodeGeneratorsFactoriesConfig(): array
    {
        return $this->codeGeneratorsConfig;
        return $this->codeGeneratorsFactoriesConfig;
    }

    /**
     * @param array $codeGeneratorsFactoriesConfig
     * @return static
     */
    public function setCodeGeneratorsFactoriesConfig(array $codeGeneratorsFactoriesConfig): Config
    {
        $this->codeGeneratorsFactoriesConfig = $codeGeneratorsFactoriesConfig;

        return $this;
    }

    /**
Loading