* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\DoctrineBundle\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\Component\HttpKernel\Util\Filesystem; use Symfony\Bundle\DoctrineAbstractBundle\Common\DataFixtures\Loader as DataFixturesLoader; use Doctrine\Common\DataFixtures\Executor\ORMExecutor; use Doctrine\Common\DataFixtures\Purger\ORMPurger; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Internal\CommitOrderCalculator; use Doctrine\ORM\Mapping\ClassMetadata; use InvalidArgumentException; /** * Load data fixtures from bundles. * * @author Fabien Potencier * @author Jonathan H. Wage */ class LoadDataFixturesDoctrineCommand extends DoctrineCommand { protected function configure() { $this ->setName('doctrine:data:load') ->setDescription('Load data fixtures to your database.') ->addOption('fixtures', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The directory or file to load data fixtures from.') ->addOption('append', null, InputOption::VALUE_OPTIONAL, 'Whether or not to append the data fixtures.', false) ->addOption('em', null, InputOption::VALUE_REQUIRED, 'The entity manager to use for this command.') ->setHelp(<<doctrine:data:load command loads data fixtures from your bundles: ./app/console doctrine:data:load You can also optionally specify the path to fixtures with the --fixtures option: ./app/console doctrine:data:load --fixtures=/path/to/fixtures1 --fixtures=/path/to/fixtures2 If you want to append the fixtures instead of flushing the database first you can use the --append option: ./app/console doctrine:data:load --append EOT ); } protected function execute(InputInterface $input, OutputInterface $output) { $emName = $input->getOption('em'); $emName = $emName ? $emName : 'default'; $emServiceName = sprintf('doctrine.orm.%s_entity_manager', $emName); if (!$this->container->has($emServiceName)) { throw new InvalidArgumentException( sprintf( 'Could not find an entity manager configured with the name "%s". Check your '. 'application configuration to configure your Doctrine entity managers.', $emName ) ); } $em = $this->container->get($emServiceName); $dirOrFile = $input->getOption('fixtures'); if ($dirOrFile) { $paths = is_array($dirOrFile) ? $dirOrFile : array($dirOrFile); } else { $paths = array(); foreach ($this->getApplication()->getKernel()->getBundles() as $bundle) { $paths[] = $bundle->getPath().'/DataFixtures/ORM'; } } $loader = new DataFixturesLoader($this->container); foreach ($paths as $path) { if (is_dir($path)) { $loader->loadFromDirectory($path); } } $fixtures = $loader->getFixtures(); if (!$fixtures) { throw new InvalidArgumentException( sprintf('Could not find any fixtures to load in: %s', "\n\n- ".implode("\n- ", $paths)) ); } $purger = new ORMPurger($em); $executor = new ORMExecutor($em, $purger); $executor->setLogger(function($message) use ($output) { $output->writeln(sprintf(' > %s', $message)); }); $executor->execute($fixtures, $input->getOption('append')); } }