2016-10-17 4 views
1

나는 generate : doctrine : entity라고하는 엔티티 생성 스크립트를 수정할 수있는 방법이 있는지 궁금합니다. 예를 들어 스크립트엔티티에 대한 사용자 정의 Symfony 생성 스크립트

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을 생성하지만 난 거기에 EntityRepository 내 자신의 저장소 서브 클래스를 확장 (그리고 괄호에 대해 서로 다른 규칙을 사용)이

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

우리는 우리 자신의 명령을 만들었습니다. 귀하의 요구 사항과 완벽하게 일치하는 것으로 보입니다.

물론 몇 가지 폴더 등을 조정해야하지만 기본적으로 정확히 무엇을 요구하는지 않습니다. 다른 필요에 맞게 조정하십시오.

app (Symfony 2) 또는 bin (Symfony 3)/console company : createrepository MyEntity를 확장하면 저장소 파일이 생성됩니다.

<?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>'); 
    } 
} 
} 
관련 문제