2017-03-16 1 views
0

심포니 2 명령 클래스를 사용하여 배치 파일을 작성합니다. 난 번들 내부의 컨트롤러에서 DB를 다루는 기능이symfony 2의 명령 클래스에서 클래스 컨트롤러 기능을 사용하는 방법은 무엇입니까?

class SubmitDisclosureController extends FOSRestController implements MEAuthController { ... public function discDetails($discId) {
$emr = $this->getDoctrine()->getEntityManager();

내가 그것을 실행하려고하면

class BatchJobCommand extends Command 
{ 
protected function execute(InputInterface $input, OutputInterface $output) 
{ 
    $output->writeln([ 
      'User Creator', 
      '============', 
      '', 
     ]); 

    // retrieve the argument value using getArgument() 
    $output->writeln('First batch job') 

    $disc = new SubmitDisclosureController(); 
    $disc->discDetails('42094'); 
` 

다음과 같다 명령 src/AppBundle/Command/BatchJobCommand.php 에서이 호출하고

, 그것을 PHP Fatal error: Call to a member function has() on null in C:\xampp\htdocs\GR\ vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller. php on line 288

명령 클래스에서 컨트롤러의 기능을 호출하여 코드를 재사용 할 수 있습니까?

+2

는 당신이 필요로 서비스 사실이다 컨트롤러와 명령 모두에서 사용할 수 있습니다. –

+0

@MateiMihai 네, 맞습니다. 그러나 이러한 변화는 기존 기능에 영향을 미칠 것입니다. –

답변

1

은 무엇 Matei 정확히 당신이 필요로하는 무엇을 말하는 : 서비스를 만들고 각 클래스에서 사용할 : 당신의 services.yml 구성 파일에서

class DisclosureService { ... public function discDetails($discId) {...} } 

을, 당신은 그것을 추가해야합니다. 명령 & 컨트롤러에서

disclosure: 
    class: Your\Namespace\DisclosureService 
    arguments: ["@doctrine", ...] 

, 당신과 함께 서비스를 호출 할 수 있습니다

$this->get('disclosure')->discDetails('') 

자세한 사항은 공식 문서에서 찾을 수 있습니다 : 사실 http://symfony.com/doc/current/service_container.html

+1

주 : 명령에서 정의 된 서비스를 사용하려면 ContainerAwareCommand를 확장해야합니다. 또한'$ this-> getContainer() -> get ('disclosure'); '명령으로 서비스에 액세스하려면 다른 코드가 필요합니다. 또한 참조하십시오 : http://symfony.com/doc/current/console.html#getting-services-from-the-service-container – Joe

+0

ContainerAwareCommand 및 기본 Controller 클래스에 대한 약간 귀찮은 일 중 하나는 질식하지 말고 명령 클래스에는 get 함수가 없다는 것입니다. 따라서 코드가 게시 된 것처럼 작동하지 않습니다. 편집 : @ 조가 약 3 초 나를 때 렸습니다. – Cerad

3
$disc = new SubmitDisclosureController(); 
$disc->setContainer($this->getContainer()); 
$disc->discDetails('42094'); 

오류 메시지가 표시됩니다. 그러나 @MateiMihai에 따르면 더 나은 디자인은 디스크 기능을 자체 서비스로 옮긴 다음 컨트롤러, 명령 및 테스트 클래스간에 디스크 기능을 공유하는 것입니다. http://symfony.com/doc/current/service_container.html `

+0

나는 당신의 대답을 시도했다. 새로운 오류가 나타납니다. 'PHP Notice : 정의되지 않은 상수 OCI_COMMIT_ON_SUCCESS의 사용 - 'OCI_COMMIT_ON_SUCCESS'로 가정. 로컬 DB에 연결할 수 있으며 정상적으로 작동합니다. 이 문제는 명령 줄에서 시도 할 때만 발생합니다. CLI에서 사용할 OCI8에 대한 별도의 설정이 있습니까? –

+0

Nope. 당신이 설정 파일을 정말로 속지 않으면 정확히 같은 연결 항목이어야합니다. 하지만 당신은 다른 대답을 받아들이므로 모든 것이 잘된 것 같아요. – Cerad

+0

원래 게시물에 효과가 있었기 때문에 대답을 수락했습니다. 이제 문제는 시스템 구성입니다.'Notice : 정의되지 않은 상수 사용 OCI_COMMIT_ON_SUCCESS - 'OCI_COMM IT_ON_SUCCESS'' –

관련 문제