/DoctrineMigrationsServiceProvider

Provides Doctrine Migrations commands in Silex applications by extending console with additional commands.

Primary LanguagePHP

Doctrine Migrations Service Provider

Provides Doctrine Migrations commands in Silex applications by extending console with additional commands. Those commands are wrappers for base Doctrine Migrations commands and for proper working require console application to be instance of console provided by Codito Console Service Provider, because commands need access to some services and/or config options to properly resolve migrations configuration.

Requirements

  • PHP >= 5.4 because of traits and short array syntax.

Installation

Add entries to composer.json:

"require": {
    "codito/doctrine-migrations-service-provider": "~2.0"
}

Configuration

In order to use Doctrine Migrations commands in your console, you have to configure few things:

  • DoctrineServiceProvider (one of Silex's default providers)
  • ConsoleServiceProvider from here
  • DoctrineOrmServiceProvider from here, optionally (required only for migrations:diff command)
  • DoctrineMigrationsServiceProvider itself

DoctrineMigrationsServiceProvider supports configuration both for single and multiple connections/entity managers.

Example config

Register DoctrineServiceProvider (can be also configured with db.options, then it will be default connection)

$app->register(new DoctrineServiceProvider(), array(
    'dbs.options' => array(
        'some_connection' => array(
            'driver'   => 'pdo_mysql',
            'dbname'   => 'silex',
            'host'     => 'localhost',
            'user'     => 'root',
            'password' => null,
            'port'     => null,
        )
    )
));

Register ConsoleServiceProvider

$app->register(new \Codito\Silex\Provider\ConsoleServiceProvider(), array(
    'console.name'              => 'Silex App',
    'console.version'           => '1.0.0',
));

Register DoctrineMigrationsServiceProvider:

$app->register(new \Codito\Silex\DoctrineMigrationsService\Provider\DoctrineMigrationsServiceProvider(), array(
    'db.migrations.options' => array(
        'some_connection' => array(
            'dir_name' => realpath(__DIR__ . '/Application/Migrations'),
            'namespace' => 'Application\\Migrations',
            'table_name' => 'migration_versions',
            'name' => 'Application Migrations',
        )
    )
));

Configuration of DoctrineMigrationsServiceProvider is always under db.migrations.options, regardless to single or multiple configs. Those configs are related to db.options/dbs.options and names must match in order to work correctly.

Optionally, if you need migrations:diff command, you may want to register

$app->register(new Dflydev\Silex\Provider\DoctrineOrm\DoctrineOrmServiceProvider(), array(
    'orm.proxies_dir' => __DIR__ . '/../var/orm',
    'orm.ems.options' => array(
        'some_entity_manager' => array(
            'connection' => 'some_connection', // Important if you have custom connection name
            'mappings' => array(
                // Using actual filesystem paths
                array(
                    'type' => 'annotation',
                    'namespace' => 'Application\Entity',
                    'path' => __DIR__ . '/Application/Entity',
                    'use_simple_annotation_reader' => false // Support for "use Doctrine\ORM\Mapping AS ORM" -> "@ORM\Entity"
                ),
            ),
        )
    ),
));

If you want to use complex annotations, like @ORM\Entity, you have to set use_simple_annotation_reader to false like above. However it requires to configure AnnotationRegistry on your own, like:

$loader = require_once __DIR__.'/../vendor/autoload.php';
\Doctrine\Common\Annotations\AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

It should be done in console executable file.

Usage

Just run php bin/console (or wherever you have console) and commands list will appear. Each command has own help, to view it just type php bin/console some:command:from:your:commands:list --help.

If you did everything properly, complete migration commands would look like:

doctrine
  doctrine:migrations:diff       Generate a migration by comparing your current database to your mapping information.
  doctrine:migrations:execute    Execute a single migration version up or down manually.
  doctrine:migrations:generate   Generate a blank migration class.
  doctrine:migrations:latest     Outputs the latest version number
  doctrine:migrations:migrate    Execute a migration to a specified version or the latest available version.
  doctrine:migrations:status     View the status of a set of migrations.
  doctrine:migrations:version    Manually add and delete migration versions from the version table.

Container aware migrations

Since v2.1 there is possibility to use migrations with auto-injected Pimple container (Silex app). If you need cointainer inside migrations, just implement Codito\Silex\DoctrineMigrationsService\Migration\ContainerAwareMigration interface or extend Codito\Silex\DoctrineMigrationsService\Migration\AbstractContainerAwareMigration. This is helpful if you have multiple connections and migration for one connection requires data from other connection or if some service must be called in order to execute migration.

Please notice

Depending on your config you have to (or don't) pass --db/--em param to command. --db is used for most of commands, --em is only for doctrine:migrations:diff and it will automatically set --db option based on connection attribute in entity manager's config.