The database migrations feature is an extension of the database abstraction layer and offers you the ability to programmatically deploy new versions of your database schema in a safe and standardized way.
Even though Doctrine has schema-tool commands to update the database schema, its suggested to use doctrine migrations when updating the production database. Schema-tool database drop and update commands which may harm the database, so the safe approach would be doctrine migrations for production servers.
Doctrine migration update database by comparing schema files and database, generates a migration file, then migrates schema changes to the database.
Following image depicts the process.
Doctrine Migrations Setup
In order to use migrations we need to do the initial setup. There are two ways to install Doctrine migrations.
- Use as a supplement to already existing Doctrine setup
- Use as a standalone PHP Binary (PHAR)
As a supplement
1. Get the sources from the GitHub repository either by downloading them, checking them out as SVN external or a Git submodule. Let’s download it by adding “doctrine/migrations”: “dev-master” to compose and update it
2. Create console.php at the root of the project directory and add following stuffs to it
- Setup a class loader to load the DoctrineDBALMigrations namespace into the project
use DoctrineCommonClassLoader; $classLoader = new ClassLoader('DoctrineDBALMigrations', '/path/to/migrations/lib '); // Usually path will be /vendor/doctrine/migrations/lib $classLoader->register();
- Register migration console commands
$cli->addCommands(array( // Migrations Commands new DoctrineDBALMigrationsToolsConsoleCommandDiffCommand(), new DoctrineDBALMigrationsToolsConsoleCommandExecuteCommand(), new DoctrineDBALMigrationsToolsConsoleCommandGenerateCommand(), new DoctrineDBALMigrationsToolsConsoleCommandMigrateCommand(), new DoctrineDBALMigrationsToolsConsoleCommandStatusCommand(), new DoctrineDBALMigrationsToolsConsoleCommandVersionCommand() ));
- Add ‘entity manager’, ‘database’ and ‘dialog’ helpers
//add bootstrap file for database connection and for metadata use bootstrap as bootstrapConfig; $bootstrapConfig = new bootstrapConfig(); $db = $bootstrapConfig->entityManager->getConnection(); $helperSet = new SymfonyComponentConsoleHelperHelperSet(array( 'em' => new DoctrineORMToolsConsoleHelperEntityManagerHelper($bootstrapConfig->entityManager), 'db' => new DoctrineDBALToolsConsoleHelperConnectionHelper($db), 'dialog' => new SymfonyComponentConsoleHelperDialogHelper() ));
$cli = new SymfonyComponentConsoleApplication('Doctrine Migrations', DoctrineDBALMigrationsMigrationsVersion::VERSION); $cli->setCatchExceptions(true); $cli->setHelperSet($helperSet);
3. Configuration: create /migrations/classes/DoctrineMigrations root of the project directory and create migrations.xml or migrations.yml at the root of project and add path of migrations classes
name: Doctrine Sandbox Migrations migrations_namespace: DoctrineMigrations table_name: doctrine_migration_versions migrations_directory: /migrations/classes/DoctrineMigrations
After all the above setup we can check it by running the following command
php console.php list migrations
The above command should list migrations namespace usage.
As a standalone PHAR
1. Download the Migrations PHP Binary, which is a standalone PHAR package file with all the required dependencies. Drop the file onto the project
2. Create a batch script to register a system command for the migrations
#!/bin/sh php /path/to/doctrine-migrations.phar "$@"
3. As PHAR file is standalone file and expects db configuration parameters to be passed. Create migrations-db.php and add db configurations parameters
//migrations-db.php return array( 'driver' => 'pdo_mysql', 'host' => 'myDbHostIP', 'user' => 'migrations', 'Password' => 'password', 'dbname' => 'myAppDb' );
4. At last add migrations.xml or migrations.yml
We shall be coming up with a Part 2 to this series, wherein we discuss the some other aspects involved in doctrine migrations such as the generate function, status function etc.