2016-10-17 5 views
1

Мне просто интересно, есть ли способ изменить скрипты генерации сущностей (вызванные с помощью generate: doctrine: entity).Пользовательские скрипты генерации Symfony для объектов

Например, сценарий создает EntityRepository как этот

use Doctrine\ORM\EntityRepository; 

/** 
* FreeTokenRepository 
* 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 
class FreeTokenRepository extends EntityRepository 
{ 
} 

, но я хотел бы иметь EntityRepository расширить свой собственный Repository подкласс (а также используют различные соглашения для скобок), как этот

use AppBundle\Model\Repository; 

/** 
* FreeTokenRepository 
* 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 
class FreeTokenRepository extends Repository { 
} 

Есть любой способ настроить скрипты создания symfony/doctrine? И все остальные сценарии поколения? Так что мне не нужно каждый раз менять мои автогенерированные классы?

ответ

1

Мы создали для этого свою собственную команду. Я поделюсь с вами кодом здесь, потому что он, похоже, отлично соответствует вашим требованиям.

Конечно, вам придется адаптировать некоторые папки и т. Д., Но в основном это именно то, о чем вы просите. Просто настройте его на другие нужды.

Просто позвоните в приложение (Symfony 2) или bin (Symfony 3)/консольная компания: createrepository MyEntity Extends и создаст ваш файл репозитория.

<?php 

namespace Company\MyBundle\Command; 

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputArgument; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 
use Symfony\Component\Console\Question\ConfirmationQuestion; 
use Symfony\Component\HttpKernel\Kernel; 

/** 
* Creates a Repository File for a given Entity Class 
* 
* You will find a file called EntityRepository.php in Repositories folder 
* Reformat the output code and enjoy 
* 
* 
*/ 
class CreaterepositoryCommand extends ContainerAwareCommand 
{ 
/** 
* 
*/ 
protected function configure() 
{ 
    $this 
     ->setName('company:createrepository') 
     ->setDescription('Create an Repository for entity class') 
     ->addArgument('entity', InputArgument::REQUIRED, 'Enter an entity class name') 
     ->addArgument(
      'extends', 
      InputArgument::OPTIONAL, 
      'Enter which other Repository should be extended'); 
} 

/** 
* @param InputInterface $input 
* @param OutputInterface $output 
* 
* @return int|null|void 
*/ 
protected function execute(InputInterface $input, OutputInterface $output) 
{ 

    $manualEntity = $input->getArgument('entity'); 

    if ($input->getArgument('extends')) { 
     $extends = $input->getArgument('extends') . "Repository"; 
     $use = ''; 
    } else { 
     $extends = "EntityRepository"; 
     $use = ' 
     use Doctrine\ORM\EntityRepository; 
     '; 
    } 

    $fileContent = ' 
    <?php 

     namespace Company\MyBundle\Entity\Repositories; 
     ' . $use . ' 
     class ' . $manualEntity . 'Repository extends ' . $extends . ' 
     { 

     } '; 

    /** @var Kernel $kernel */ 
    $kernel = $this->getContainer()->get('kernel'); 
    $path = $kernel->locateResource('@CompanyMyBundle'); 
    $path .= 'Entity/Repositories'; 
    $fileName = $manualEntity . "Repository.php"; 
    $fileNameInclPath = $path . "/" . $fileName; 

    if (file_exists($fileNameInclPath)) { 
     $helper = $this->getHelper('question'); 
     $question = new ConfirmationQuestion(
      '<fg=blue>File: </fg=blue>' . $fileName . '<fg=blue> already exists Overwrite?</fg=blue>', 
      false); 

     if (!$helper->ask($input, $output, $question)) { 
      $output->writeln('<fg=red>Aborted by user.</fg=red>'); 
     } else { 
      $fp = fopen($fileNameInclPath, "wb"); 
      fwrite($fp, $fileContent); 
      fclose($fp); 
      $output->writeln('<fg=green>File:</fg=green> ' . $fileName . '<fg=green> created</fg=green>'); 
     } 
    } else { 
     $fp = fopen($fileNameInclPath, "wb"); 
     fwrite($fp, $fileContent); 
     fclose($fp); 
     $output->writeln('<fg=green>File:</fg=green> ' . $fileName . '<fg=green> created</fg=green>'); 
    } 
} 
}