Integrating new data fixtures code.

This commit is contained in:
Jonathan H. Wage 2010-10-04 22:23:45 -05:00 committed by Fabien Potencier
parent 2525998f6e
commit ff683a694e
12 changed files with 257 additions and 156 deletions

View File

@ -6,13 +6,14 @@ use Symfony\Component\HttpFoundation\UniversalClassLoader;
$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
'Symfony' => __DIR__.'/src',
'Doctrine\\ODM\\MongoDB' => __DIR__.'/vendor/doctrine-mongodb/lib',
'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
'Doctrine\\DBAL\\Migrations' => __DIR__.'/vendor/doctrine-migrations/lib',
'Doctrine\\DBAL' => __DIR__.'/vendor/doctrine-dbal/lib',
'Doctrine' => __DIR__.'/vendor/doctrine/lib',
'Zend' => __DIR__.'/vendor/zend/library',
'Symfony' => __DIR__.'/src',
'Doctrine\\ODM\\MongoDB' => __DIR__.'/vendor/doctrine-mongodb/lib',
'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
'Doctrine\\DBAL\\Migrations' => __DIR__.'/vendor/doctrine-migrations/lib',
'Doctrine\\DBAL' => __DIR__.'/vendor/doctrine-dbal/lib',
'Doctrine\\ORM\\DataFixtures' => __DIR__.'/vendor/doctrine-orm-data-fixtures',
'Doctrine' => __DIR__.'/vendor/doctrine/lib',
'Zend' => __DIR__.'/vendor/zend/library',
));
$loader->registerPrefixes(array(
'Swift_' => __DIR__.'/vendor/swiftmailer/lib/classes',
@ -26,4 +27,4 @@ set_include_path(
__DIR__.'/vendor/phing/classes'.PATH_SEPARATOR.
__DIR__.'/vendor/propel/runtime/lib'.PATH_SEPARATOR.
get_include_path()
);
);

View File

@ -12,6 +12,9 @@ cd vendor
# Doctrine ORM
git clone git://github.com/doctrine/doctrine2.git doctrine
# Doctrine ORM Data Fixtures Extension
git clone git://github.com/doctrine/orm-data-fixtures doctrine-orm-data-fixtures
# Doctrine DBAL
git clone git://github.com/doctrine/dbal.git doctrine-dbal

View File

@ -39,6 +39,7 @@ class LoadDataFixturesDoctrineCommand extends DoctrineCommand
->setDescription('Load data fixtures to your database.')
->addOption('fixtures', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY, 'The directory or file to load data fixtures from.')
->addOption('append', null, InputOption::PARAMETER_OPTIONAL, 'Whether or not to append the data fixtures.', false)
->addOption('em', null, InputOption::PARAMETER_REQUIRED, 'The entity manager to use for this command.')
->setHelp(<<<EOT
The <info>doctrine:data:load</info> command loads data fixtures from your bundles:
@ -57,7 +58,10 @@ EOT
protected function execute(InputInterface $input, OutputInterface $output)
{
$defaultEm = $this->container->getDoctrine_ORM_EntityManagerService();
$emName = $input->getOption('em');
$emName = $emName ? $emName : 'default';
$emServiceName = sprintf('doctrine.orm.%s_entity_manager', $emName);
$em = $this->container->get($emServiceName);
$dirOrFile = $input->getOption('fixtures');
if ($dirOrFile) {
$paths = is_array($dirOrFile) ? $dirOrFile : array($dirOrFile);
@ -69,139 +73,19 @@ EOT
$namespace = str_replace('/', '\\', dirname($tmp));
$class = basename($tmp);
if (isset($bundleDirs[$namespace]) && is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Resources/data/fixtures/doctrine/orm')) {
if (isset($bundleDirs[$namespace]) && is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/DataFixtures/ORM')) {
$paths[] = $dir;
}
}
}
$files = array();
$loader = new \Doctrine\Common\DataFixtures\Loader();
foreach ($paths as $path) {
if (is_dir($path)) {
$finder = new Finder();
$found = iterator_to_array($finder
->files()
->name('*.php')
->in($path));
} else {
$found = array($path);
}
$files = array_merge($files, $found);
}
$ems = array();
$emEntities = array();
$files = array_unique($files);
foreach ($files as $file) {
$em = $defaultEm;
$output->writeln(sprintf('<info>Loading data fixtures from <comment>"%s"</comment></info>', $file));
$before = array_keys(get_defined_vars());
include($file);
$after = array_keys(get_defined_vars());
$new = array_diff($after, $before);
$params = $em->getConnection()->getParams();
$emName = isset($params['path']) ? $params['path']:$params['dbname'];
$ems[$emName] = $em;
$emEntities[$emName] = array();
$variables = array_values($new);
foreach ($variables as $variable) {
$value = $$variable;
if (!is_object($value) || $value instanceof \Doctrine\ORM\EntityManager) {
continue;
}
$emEntities[$emName][] = $value;
}
foreach ($ems as $emName => $em) {
if (!$input->getOption('append')) {
$output->writeln(sprintf('<info>Purging data from entity manager named <comment>"%s"</comment></info>', $emName));
$this->purgeEntityManager($em);
}
$entities = $emEntities[$emName];
$numEntities = count($entities);
$output->writeln(sprintf('<info>Persisting "%s" '.($numEntities > 1 ? 'entities' : 'entity').'</info>', count($entities)));
foreach ($entities as $entity) {
$em->persist($entity);
}
$output->writeln('<info>Flushing entity manager</info>');
$em->flush();
}
$loader->loadFromDirectory($path);
}
$fixtures = $loader->getFixtures();
$purger = new \Doctrine\Common\DataFixtures\Purger\ORMPurger($em);
$executor = new \Doctrine\Common\DataFixtures\Executor\ORMExecutor($em, $purger);
$executor->execute($fixtures, $input->getOption('append'));
}
protected function purgeEntityManager(EntityManager $em)
{
$classes = array();
$metadatas = $em->getMetadataFactory()->getAllMetadata();
foreach ($metadatas as $metadata) {
if (!$metadata->isMappedSuperclass) {
$classes[] = $metadata;
}
}
$commitOrder = $this->getCommitOrder($em, $classes);
// Drop association tables first
$orderedTables = $this->getAssociationTables($commitOrder);
// Drop tables in reverse commit order
for ($i = count($commitOrder) - 1; $i >= 0; --$i) {
$class = $commitOrder[$i];
if (($class->isInheritanceTypeSingleTable() && $class->name != $class->rootEntityName)
|| $class->isMappedSuperclass) {
continue;
}
$orderedTables[] = $class->getTableName();
}
foreach($orderedTables as $tbl) {
$em->getConnection()->executeUpdate("DELETE FROM $tbl");
}
}
protected function getCommitOrder(EntityManager $em, array $classes)
{
$calc = new CommitOrderCalculator;
foreach ($classes as $class) {
$calc->addClass($class);
foreach ($class->associationMappings as $assoc) {
if ($assoc['isOwningSide']) {
$targetClass = $em->getClassMetadata($assoc['targetEntity']);
if ( ! $calc->hasClass($targetClass->name)) {
$calc->addClass($targetClass);
}
// add dependency ($targetClass before $class)
$calc->addDependency($targetClass, $class);
}
}
}
return $calc->getCommitOrder();
}
protected function getAssociationTables(array $classes)
{
$associationTables = array();
foreach ($classes as $class) {
foreach ($class->associationMappings as $assoc) {
if ($assoc['isOwningSide'] && $assoc['type'] == ClassMetadata::MANY_TO_MANY) {
$associationTables[] = $assoc['joinTable']['name'];
}
}
}
return $associationTables;
}
}
}

View File

@ -7,15 +7,16 @@
<parameters>
<parameter key="doctrine.dbal.default_connection">default</parameter>
<parameter key="doctrine.dbal.connection_class">Doctrine\DBAL\Connection</parameter>
<parameter key="doctrine.dbal.logger.debug_class">Doctrine\DBAL\Logging\DebugStack</parameter>
<parameter key="doctrine.dbal.logger_class">Symfony\Bundle\DoctrineBundle\Logger\DbalLogger</parameter>
<parameter key="doctrine.data_collector.class">Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector</parameter>
<parameter key="doctrine.dbal.default_connection">default</parameter>
</parameters>
<services>
<service id="doctrine.dbal.logger.debug" class="Doctrine\DBAL\Logging\DebugStack" />
<service id="doctrine.dbal.logger.debug" class="%doctrine.dbal.logger.debug_class%" />
<service id="doctrine.dbal.logger" class="Symfony\Bundle\DoctrineBundle\Logger\DbalLogger">
<service id="doctrine.dbal.logger" class="%doctrine.dbal.logger_class%">
<argument type="service" id="logger" on-invalid="null" />
</service>
@ -24,4 +25,4 @@
<argument type="service" id="doctrine.dbal.logger" />
</service>
</services>
</container>
</container>

View File

@ -42,13 +42,12 @@
<services>
<!--- Annotation Metadata Driver Service -->
<service id="doctrine.orm.metadata_driver.annotation" class="Doctrine\ORM\Mapping\Driver\AnnotationDriver">
<service id="doctrine.orm.metadata_driver.annotation" class="%doctrine.orm.metadata.annotation_class%">
<argument type="service" id="doctrine.orm.metadata_driver.annotation.reader" />
<argument>%doctrine.orm.metadata_driver.entity_dirs%</argument>
</service>
<service id="doctrine.orm.metadata_driver.annotation.reader" class="Doctrine\Common\Annotations\AnnotationReader">
<call method="setDefaultAnnotationNamespace"><argument>%doctrine.orm.metadata.annotation_default_namespace%</argument></call>
<service id="doctrine.orm.metadata_driver.annotation.reader" class="%doctrine.orm.metadata.annotation_reader_class%">
<call method="setAnnotationNamespaceAlias">
<argument>Doctrine\ORM\Mapping\</argument>
<argument>orm</argument>
@ -56,12 +55,12 @@
</service>
<!--- XML Metadata Driver Service -->
<service id="doctrine.orm.metadata_driver.xml" class="Doctrine\ORM\Mapping\Driver\XmlDriver">
<service id="doctrine.orm.metadata_driver.xml" class="%doctrine.orm.metadata.xml_class%">
<argument>%doctrine.orm.metadata_driver.mapping_dirs%</argument>
</service>
<!--- YAML Metadata Driver Service -->
<service id="doctrine.orm.metadata_driver.yml" class="Doctrine\ORM\Mapping\Driver\YamlDriver">
<service id="doctrine.orm.metadata_driver.yml" class="%doctrine.orm.metadata.yml_class%">
<argument>%doctrine.orm.metadata_driver.mapping_dirs%</argument>
</service>
</services>

View File

@ -0,0 +1,62 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bundle\DoctrineBundle\Tests;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class ContainerTest extends TestCase
{
public function getContainer()
{
$container = new ContainerBuilder(new ParameterBag(array(
'kernel.bundle_dirs' => array(),
'kernel.bundles' => array(),
'kernel.cache_dir' => sys_get_temp_dir(),
)));
$loader = new DoctrineExtension();
$container->registerExtension($loader);
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);
$dumper = new PhpDumper($container);
$code = $dumper->dump();
eval(str_replace('<?php', null, $code));
return new \ProjectServiceContainer;
}
public function testContainer()
{
$container = $this->getContainer();
$this->assertInstanceOf('Doctrine\DBAL\Logging\DebugStack', $container->get('doctrine.dbal.logger.debug'));
$this->assertInstanceOf('Doctrine\DBAL\Logging\DebugStack', $container->get('doctrine.dbal.logger'));
$this->assertInstanceOf('Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector', $container->get('doctrine.data_collector'));
$this->assertInstanceOf('Doctrine\DBAL\Configuration', $container->get('doctrine.dbal.default_connection.configuration'));
$this->assertInstanceOf('Doctrine\Common\EventManager', $container->get('doctrine.dbal.default_connection.event_manager'));
$this->assertInstanceOf('Doctrine\DBAL\Connection', $container->get('doctrine.dbal.default_connection'));
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\AnnotationDriver', $container->get('doctrine.orm.metadata_driver.annotation'));
$this->assertInstanceOf('Doctrine\Common\Annotations\AnnotationReader', $container->get('doctrine.orm.metadata_driver.annotation.reader'));
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\XmlDriver', $container->get('doctrine.orm.metadata_driver.xml'));
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\YamlDriver', $container->get('doctrine.orm.metadata_driver.yml'));
$this->assertInstanceOf('Doctrine\ORM\Configuration', $container->get('doctrine.orm.default_configuration'));
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\DriverChain', $container->get('doctrine.orm.metadata_driver'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_metadata_cache'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_query_cache'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_result_cache'));
$this->assertInstanceOf('Doctrine\ORM\EntityManager', $container->get('doctrine.orm.default_entity_manager'));
$this->assertInstanceOf('Doctrine\DBAL\Connection', $container->get('database_connection'));
$this->assertInstanceOf('Doctrine\ORM\EntityManager', $container->get('doctrine.orm.entity_manager'));
}
}

View File

@ -21,16 +21,16 @@ class CreateSchemaDoctrineODMCommand extends CreateCommand
parent::configure();
$this
->setName('doctrine:odm:schema:create')
->setName('doctrine:mongodb:schema:create')
->addOption('dm', null, InputOption::PARAMETER_REQUIRED, 'The document manager to use for this command.')
->setHelp(<<<EOT
The <info>doctrine:odm:schema:create</info> command creates the default document manager's schema:
The <info>doctrine:mongodb:schema:create</info> command creates the default document manager's schema:
<info>./symfony doctrine:odm:schema:create</info>
<info>./symfony doctrine:mongodb:schema:create</info>
You can also optionally specify the name of a document manager to create the schema for:
<info>./symfony doctrine:odm:schema:create --dm=default</info>
<info>./symfony doctrine:mongodb:schema:create --dm=default</info>
EOT
);
}

View File

@ -21,16 +21,16 @@ class DropSchemaDoctrineODMCommand extends DropCommand
parent::configure();
$this
->setName('doctrine:odm:schema:drop')
->setName('doctrine:mongodb:schema:drop')
->addOption('dm', null, InputOption::PARAMETER_REQUIRED, 'The document manager to use for this command.')
->setHelp(<<<EOT
The <info>doctrine:odm:schema:drop</info> command drops the default document manager's schema:
The <info>doctrine:mongodb:schema:drop</info> command drops the default document manager's schema:
<info>./symfony doctrine:odm:schema:drop</info>
<info>./symfony doctrine:mongodb:schema:drop</info>
You can also optionally specify the name of a document manager to drop the schema for:
<info>./symfony doctrine:odm:schema:drop --dm=default</info>
<info>./symfony doctrine:mongodb:schema:drop --dm=default</info>
EOT
);
}

View File

@ -0,0 +1,91 @@
<?php
namespace Symfony\Bundle\DoctrineMongoDBBundle\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\Output;
use Symfony\Component\Finder\Finder;
use Symfony\Bundle\FrameworkBundle\Util\Filesystem;
use Doctrine\Common\Cli\Configuration;
use Doctrine\Common\Cli\CliController as DoctrineCliController;
use Doctrine\ODM\MongoDB\DocumentManager;
use Doctrine\ODM\MongoDB\Internal\CommitOrderCalculator;
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
/*
* This file is part of the Symfony framework.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
/**
* Load data fixtures from bundles.
*
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
* @author Jonathan H. Wage <jonwage@gmail.com>
*/
class LoadDataFixturesDoctrineODMCommand extends DoctrineODMCommand
{
protected function configure()
{
$this
->setName('doctrine:mongodb:data:load')
->setDescription('Load data fixtures to your database.')
->addOption('fixtures', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY, 'The directory or file to load data fixtures from.')
->addOption('append', null, InputOption::PARAMETER_OPTIONAL, 'Whether or not to append the data fixtures.', false)
->addOption('dm', null, InputOption::PARAMETER_REQUIRED, 'The document manager to use for this command.')
->setHelp(<<<EOT
The <info>doctrine:mongodb:data:load</info> command loads data fixtures from your bundles:
<info>./symfony doctrine:mongodb:data:load</info>
You can also optionally specify the path to fixtures with the <info>--fixtures</info> option:
<info>./symfony doctrine:mongodb:data:load --fixtures=/path/to/fixtures1 --fixtures=/path/to/fixtures2</info>
If you want to append the fixtures instead of flushing the database first you can use the <info>--append</info> option:
<info>./symfony doctrine:mongodb:data:load --append</info>
EOT
);
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$dmName = $input->getOption('dm');
$dmName = $dmName ? $dmName : 'default';
$dmServiceName = sprintf('doctrine.odm.mongodb.%s_document_manager', $dmName);
$dm = $this->container->get($dmServiceName);
$dirOrFile = $input->getOption('fixtures');
if ($dirOrFile) {
$paths = is_array($dirOrFile) ? $dirOrFile : array($dirOrFile);
} else {
$paths = array();
$bundleDirs = $this->container->getKernelService()->getBundleDirs();
foreach ($this->container->getKernelService()->getBundles() as $bundle) {
$tmp = dirname(str_replace('\\', '/', get_class($bundle)));
$namespace = str_replace('/', '\\', dirname($tmp));
$class = basename($tmp);
if (isset($bundleDirs[$namespace]) && is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/DataFixtures/MongoDB')) {
$paths[] = $dir;
}
}
}
$loader = new \Doctrine\Common\DataFixtures\Loader();
foreach ($paths as $path) {
$loader->loadFromDirectory($path);
}
$fixtures = $loader->getFixtures();
$purger = new \Doctrine\Common\DataFixtures\Purger\MongoDBPurger($dm);
$executor = new \Doctrine\Common\DataFixtures\Executor\MongoDBExecutor($dm, $purger);
$executor->execute($fixtures, $input->getOption('append'));
}
}

View File

@ -56,7 +56,6 @@
</service>
<service id="doctrine.odm.mongodb.metadata.annotation_reader" class="%doctrine.odm.mongodb.metadata.annotation_reader_class%">
<argument type="service" id="doctrine.odm.mongodb.cache" />
<call method="setDefaultAnnotationNamespace"><argument>%doctrine.odm.mongodb.metadata.annotation_default_namespace%</argument></call>
<call method="setAnnotationNamespaceAlias">
<argument>Doctrine\ODM\MongoDB\Mapping\</argument>
<argument>mongodb</argument>
@ -77,4 +76,4 @@
<argument type="service" id="doctrine.odm.mongodb.logger" />
</service>
</services>
</container>
</container>

View File

@ -0,0 +1,58 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bundle\DoctrineBundle\Tests;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Bundle\DoctrineMongoDBBundle\DependencyInjection\DoctrineMongoDBExtension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class ContainerTest extends TestCase
{
public function getContainer()
{
$container = new ContainerBuilder(new ParameterBag(array(
'kernel.bundle_dirs' => array(),
'kernel.bundles' => array(),
'kernel.cache_dir' => sys_get_temp_dir(),
)));
$loader = new DoctrineMongoDBExtension();
$container->registerExtension($loader);
$loader->mongodbLoad(array(), $container);
$dumper = new PhpDumper($container);
$code = $dumper->dump();
eval(str_replace('<?php', null, $code));
return new \ProjectServiceContainer;
}
public function testContainer()
{
$container = $this->getContainer();
$this->assertInstanceOf('Doctrine\ODM\MongoDB\Mapping\Driver\DriverChain', $container->get('doctrine.odm.mongodb.metadata.chain'));
$this->assertInstanceOf('Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver', $container->get('doctrine.odm.mongodb.metadata.annotation'));
$this->assertInstanceOf('Doctrine\Common\Annotations\AnnotationReader', $container->get('doctrine.odm.mongodb.metadata.annotation_reader'));
$this->assertInstanceOf('Doctrine\ODM\MongoDB\Mapping\Driver\XmlDriver', $container->get('doctrine.odm.mongodb.metadata.xml'));
$this->assertInstanceOf('Doctrine\ODM\MongoDB\Mapping\Driver\YamlDriver', $container->get('doctrine.odm.mongodb.metadata.yml'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.odm.mongodb.cache.array'));
$this->assertInstanceOf('Symfony\Bundle\DoctrineMongoDBBundle\Logger\DoctrineMongoDBLogger', $container->get('doctrine.odm.mongodb.logger'));
$this->assertInstanceOf('Symfony\Bundle\DoctrineMongoDBBundle\DataCollector\DoctrineMongoDBDataCollector', $container->get('doctrine.odm.mongodb.data_collector'));
$this->assertInstanceOf('Doctrine\ODM\MongoDB\Mongo', $container->get('doctrine.odm.mongodb.default_connection'));
$this->assertInstanceOf('Doctrine\ODM\MongoDB\Configuration', $container->get('doctrine.odm.mongodb.default_configuration'));
$this->assertInstanceOf('Doctrine\ODM\MongoDB\Mapping\Driver\DriverChain', $container->get('doctrine.odm.mongodb.metadata'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.odm.mongodb.default_metadata_cache'));
$this->assertInstanceOf('Doctrine\ODM\MongoDB\DocumentManager', $container->get('doctrine.odm.mongodb.default_document_manager'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.odm.mongodb.cache'));
$this->assertInstanceOf('Doctrine\ODM\MongoDB\DocumentManager', $container->get('doctrine.odm.mongodb.document_manager'));
}
}

View File

@ -5,6 +5,9 @@ CURRENT=`pwd`/vendor
# Doctrine ORM
cd $CURRENT/doctrine && git pull
# Doctrine ORM Data Fixtures Extension
cd $CURRENT/doctrine-orm-data-fixtures && git pull
# Doctrine DBAL
cd $CURRENT/doctrine-dbal && git pull