2011-09-13 40 views
6

Symfony2的自定義控制檯命令我在SRC/MaintenanceBundle /命令創建一個新的類,將其命名爲GreetCommand.php並把下面的代碼在它:沒有工作

<?php 

namespace SK2\MaintenanceBundle\Command; 

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputArgument; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Console\Output\OutputInterface; 

class GreetCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this 
      ->setName('maintenance:greet') 
      ->setDescription('Greet someone') 
      ->addArgument('name', InputArgument::OPTIONAL, 'Who do you want to greet?') 
      ->addOption('yell', null, InputOption::VALUE_NONE, 'If set, the task will yell in uppercase letters') 
     ; 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $name = $input->getArgument('name'); 
     if ($name) { 
      $text = 'Hello '.$name; 
     } else { 
      $text = 'Hello'; 
     } 

     if ($input->getOption('yell')) { 
      $text = strtoupper($text); 
     } 

     $output->writeln($text); 
    } 
} 

?> 

並試圖通過

叫它

app/console maintenance:greet Fabien

但我總是得到以下錯誤:

[InvalidArgumentException] There are no commands defined in the "maintenance" namespace.

任何想法?

+1

您是否在創建命令後清除了緩存? –

回答

13

我想通了,爲什麼它不工作:我只是忘了在AppKernel.php註冊捆綁。但是,其他建議的答案是相關的,可能有助於解決其他情況!

按照慣例:命令文件需要駐留在一個bundle的命令目錄中,名稱以Command結尾。

在AppKernel.php

public function registerBundles() 
{ 
    $bundles = [ 
     ... 
     new MaintenanceBundle\MaintenanceBundle(), 
    ]; 

    return $bundles; 
} 
0

我認爲你必須調用parent::configure()configure方法

41

我有這個問題,這是因爲我的PHP類和文件的名稱不與Command結束。

Symfony會自動註冊以Command結尾的命令,並位於軟件包的Command目錄中。如果你想手動註冊您的命令,這個食譜項可能幫助:http://symfony.com/doc/current/cookbook/console/commands_as_services.html

+0

這一個讓我。你已經把你的命令存放在一個bundle的Command目錄中,並在最後用Command命名你的命令類。然後Symfony將自動註冊一切正確。 – Halfstop

+1

我只是有這個問題,這是因爲該文件名稱並沒有在它的結束「命令」 - 所以它不只是名字空間或目錄名稱/位置,可能會導致這一個。 –

+0

謝謝@ScottFlack。我已經更新了我的文章,以使文件名必須以'command'結尾,而不僅僅是類名。 – Sam

5

我有一個類似的問題,figgured了另一種可能的解決方案:

如果覆蓋默認__construct方法該命令將不是由symfony註冊的自動 ,所以你必須採用前面提到的服務方法,或者刪除__construct覆蓋,並在execute方法中或在configure方法中進行init步驟。

其實任何人都知道一個很好的最佳實踐如何在symfony命令中執行init「stuff」?

..把我一時摸不着頭腦..

+0

這一個讓我。乾杯。回到二傳手注射! – Edward

1

除了MonocroM的回答,我有同樣的問題,我的命令,並通過Symfony的被悄悄地忽略僅僅是因爲我的命令的構造有1點需要的參數。

我只是刪除它,並調用父__construct()方法(Symfony的2.7),效果不錯;)

1

在我的情況是抱怨「工作流程」命名空間雖然WorkflowDumpCommand正確框架提供。

但是,它無法運行,因爲我沒有定義任何工作流程,所以isEnabled()命令的方法返回false