2017-03-16 57 views
0

我建立使用symfony的2命令類的批處理文件。我有與DB優惠控制器捆綁內部功能如何在symfony 2的命令類中使用類控制器函數?

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

我從命令src/AppBundle/Command/BatchJobCommand.php 是如下

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'); 
` 

如果我試圖執行它調用這一點,給出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

什麼說馬太正是你所需要的:創建一個服務,並使用它在每個類:

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

在你services.yml的配置文件,你必須添加它。

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

在您的命令&控制器,你可以調用的服務:

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

詳細信息可以在官方文檔中找到:http://symfony.com/doc/current/service_container.html

+1

注意:如果要在命令中使用定義的服務,請確保擴展ContainerAwareCommand。你還需要一個不同的代碼來訪問命令'$ this-> getContainer() - > get('披露');''。另請參閱:http://symfony.com/doc/current/console.html#getting-services-from-the-service-container – Joe

+0

不是雞蛋裏挑骨頭,但關於ContainerAwareCommand和基本控制器類的有點惱人的事情之一是該命令類沒有get函數。所以你的代碼不能像發佈一樣工作。編輯:看起來像@Joe打了我約三秒鐘。 – Cerad

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

會讓你通過錯誤信息。然而,隨着@MateiMihai說,一個更好的設計是到光盤功能移動到它自己的服務,然後你的控制,指揮和測試類之間共享。 http://symfony.com/doc/current/service_container.html `

+0

我試過你的答案。我收到一個新的錯誤。 'PHP公告:未定義的常量OCI_COMMIT_ON_SUCCESS用途 - 假設「OCI_COMMIT_ON_SUCCESS''。我能夠在本地連接到數據庫,並且工作正常。這個問題只在我嘗試命令行的時候出現。在CLI中是否有單獨的OCI8設置? –

+0

不是。應該是完全相同的連接的東西,除非你真的騙過了配置文件。但你接受了另一個答案,所以我想一切都很好。 – Cerad

+0

我接受了答案,因爲它適用於我原來的帖子。現在問題出現在系統配置我猜'注意:使用未定義的常量OCI_COMMIT_ON_SUCCESS - 假定'OCI_COMM IT_ON_SUCCESS'' –

相關問題