Skip to content

Instantly share code, notes, and snippets.

@fesor
Created July 25, 2018 12:28
Show Gist options
  • Star 17 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fesor/0d5ecf0afc638c7870272ead20614681 to your computer and use it in GitHub Desktop.
Save fesor/0d5ecf0afc638c7870272ead20614681 to your computer and use it in GitHub Desktop.
Symfony without ORM

Удобный менеджмент миграций с Symfony и Doctrine

Мало кто знает, но что бы работал migration:diff вам не нужно ставить ORM.

Что бы это работало объявим простой сервис:

<?php

use Doctrine\DBAL\Migrations\Provider\SchemaProviderInterface;
use Doctrine\DBAL\Schema\Schema;

class DatabaseSchema implements SchemaProviderInterface
{
    public function createSchema(): Schema
    {
        $schema = new Schema();
        
        $test = $schema->createTable('test');
        $test->addColumn('id', 'guid');
        $test->addColumn('name', 'string');
        $test->setPrimaryKey(['id']);
        
        return $schema;
    }
}

Регистрируем этот класс как сервис:

services:
    DatabaseSchema: ~

И переопределяем команду для генерации миграций:

services:
    Doctrine\Bundle\MigrationsBundle\Command\MigrationsDiffDoctrineCommand:
      tags: ['console.command']
      arguments:
        - '@DatabaseSchema'

вуаля. Теперь вы можете просто вызвать bin/console doctrine:migration:diff и вуаля.

Вы так же можете задекорировать OrmSchemaProvider и накладывать сверху схему которую не менеджит ORM, или же еще как-нибудь. Да и вообще помимо доктрины есть и другие либы для работы с базой.

Удачи.

@vsmihaylovsky
Copy link

vsmihaylovsky commented Nov 27, 2018

пришлось так сделать:

doctrine_migrations.diff_command:
  class: Doctrine\Bundle\MigrationsBundle\Command\MigrationsDiffDoctrineCommand
  tags: ['console.command']
  arguments:
    - '@App\Schema\DatabaseSchema'

а то не подхватывалось

Хотя у меня не 4 симфа, может в этом дело.

@struzik-vladislav
Copy link

struzik-vladislav commented Feb 15, 2021

При работе с "doctrine/migrations": "~3.0" мануал следующий.

  1. Так же само объявляем сервис, но изменилось имя интерфейса
<?php

use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Types;
use Doctrine\Migrations\Provider\SchemaProvider;

class DatabaseSchema implements SchemaProvider
{
    public function createSchema(): Schema
    {
        $schema = new Schema();

        $table = $schema->createTable('test');
        $table->addColumn('id', Types::GUID);
        $table->addColumn('name', Types::STRING);
        $table->setPrimaryKey(['id']);

        return $schema;
    }
}
  1. В третьей версии убрали конструктор у Doctrine\Migrations\Tools\Console\Command\DiffCommand и появилась фабрика зависимостей Doctrine\Migrations\DependencyFactory в которую нужно забросить DatabaseSchema. В Symfony 4 файл конфигурации находится в config\packages\doctrine_migrations.yaml. В конфигурации нужно прописать следующее:
doctrine_migrations:
    services:
        'Doctrine\Migrations\Provider\SchemaProvider': 'DatabaseSchema'

Вот и все. Теперь можно вызывать bin/console doctrine:migrations:diff.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment