. */ namespace Doctrine\ORM\Tools\CLI\Tasks; use Doctrine\Common\CLI\Tasks\AbstractTask, Doctrine\Common\CLI\Option, Doctrine\Common\CLI\OptionGroup, Doctrine\Common\CLI\CLIException, Doctrine\ORM\Tools\ClassMetadataReader; /** * CLI Task to generate repository classes for some mapping information * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 * @version $Revision$ * @author Benjamin Eberlei * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel */ class GenerateRepositoriesTask extends ConvertMappingTask { private static $_template = '; use \Doctrine\ORM\EntityRepository; /** * * * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class extends EntityRepository { }'; /** * @inheritdoc */ public function buildDocumentation() { $options = new OptionGroup(OptionGroup::CARDINALITY_N_N, array( new Option('from', '', 'The path to mapping information.'), new Option('dest', '', 'The path to generate your repository classes.') )); $doc = $this->getDocumentation(); $doc->setName('generate-repositories') ->setDescription('Generate repository classes for some mapping information.') ->getOptionGroup() ->addOption($options); } /** * @inheritdoc */ public function validate() { $arguments = $this->getArguments(); $em = $this->getConfiguration()->getAttribute('em'); if ( ! isset($arguments['from']) || ! isset($arguments['dest'])) { throw new CLIException('You must specify a value for --from and --dest'); } return true; } public function run() { $printer = $this->getPrinter(); $arguments = $this->getArguments(); $dest = realpath($arguments['dest']); $reader = new ClassMetadataReader(); $reader->setEntityManager($this->getConfiguration()->getAttribute('em')); $reader->addMappingSource($arguments['from']); $metadatas = $reader->getMetadatas(); foreach ($metadatas as $metadata) { if ($metadata->customRepositoryClassName) { $code = $this->_generateRepositoryClass($metadata->customRepositoryClassName); $path = $dest . '/' . str_replace('\\', '/', $metadata->customRepositoryClassName) . '.php'; $dir = dirname($path); if ( ! is_dir($dir)) { mkdir($dir, 0777, true); } $printer->writeln( sprintf('Processing entity "%s"', $printer->format($metadata->customRepositoryClassName, 'KEYWORD') ) ); file_put_contents($path, $code); } } $printer->writeln(''); $printer->writeln( sprintf('Entity repository classes generated to "%s"', $printer->format($dest, 'KEYWORD') ) ); } private function _generateRepositoryClass($fullyQualifiedClassName) { $namespace = substr($fullyQualifiedClassName, 0, strrpos($fullyQualifiedClassName, '\\')); $pos = strrpos($fullyQualifiedClassName, '\\'); $className = substr($fullyQualifiedClassName, $pos + 1, strlen($fullyQualifiedClassName)); $placeHolders = array( '', '' ); $replacements = array( $namespace, $className ); $code = str_replace($placeHolders, $replacements, self::$_template); return $code; } }