2011-09-13 27 views
6

Tôi tạo ra một lớp mới trong src/MaintenanceBundle/Command, đặt tên nó là GreetCommand.php và đặt đoạn mã sau vào nó:Symfony2 tùy chỉnh giao diện điều khiển lệnh không làm việc

<?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); 
    } 
} 

?> 

Và cố gắng gọi nó qua

app/console maintenance:greet Fabien

Nhưng tôi luôn luôn nhận được lỗi sau:

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

Bất kỳ ý tưởng?

+1

Bạn có xóa bộ nhớ cache sau khi tạo lệnh không? –

Trả lời

13

tôi đã tìm ra lý do tại sao nó không được làm việc: Tôi chỉ đơn giản là quên đăng ký Bundle trong AppKernel.php. Tuy nhiên, các câu trả lời được đề xuất khác có liên quan và có thể hữu ích để giải quyết các tình huống khác!

Theo quy ước: các tệp lệnh cần phải nằm trong thư mục lệnh của gói và có tên kết thúc bằng Lệnh.

trong AppKernel.php

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

    return $bundles; 
} 
0

Tôi nghĩ rằng bạn phải gọi parent::configure() trong phương pháp configure bạn

41

Tôi có vấn đề này, và đó là vì tên của lớp PHP của tôi và tập tin không kết thúc bằng Command.

Symfony sẽ tự động đăng ký các lệnh kết thúc bằng Command và nằm trong thư mục Command của gói. Nếu bạn muốn tay đăng ký lệnh của bạn, nhập sách dạy nấu ăn này có thể giúp: http://symfony.com/doc/current/cookbook/console/commands_as_services.html

+0

Điều này đã cho tôi.Bạn đã lưu trữ các lệnh trong thư mục Command của nhóm và đặt tên cho lớp lệnh của bạn bằng Command ở cuối. Sau đó, Symfony sẽ tự động đăng ký mọi thứ một cách chính xác. – Halfstop

+1

Tôi vừa gặp sự cố này và đó là vì tên tệp không có 'Lệnh' ở cuối nó - vì vậy nó không chỉ là không gian tên hoặc tên thư mục/vị trí có thể gây ra lỗi này. –

+0

Cảm ơn @ScottFlack. Tôi đã cập nhật bài đăng của mình để làm cho nó rõ ràng hơn rằng tên tệp cũng phải kết thúc bằng 'command', không chỉ tên lớp. – Sam

5

Tôi có một vấn đề tương tự và figgured ra một giải pháp khả thi:

nếu bạn ghi đè lên các phương pháp __construct mặc định Bộ Tư lệnh sẽ không được tự động đăng ký bởi symfony, vì vậy bạn phải thực hiện phương pháp tiếp cận dịch vụ như đã đề cập trước đó hoặc xóa bỏ ghi đè __construct và thực hiện bước init đó trong phương thức thực thi .. hoặc trong phương thức cấu hình.

Thực sự có ai biết thực hành tốt nhất về cách thực hiện "công cụ" init trong lệnh symfony không?

.. đã cho tôi một chút thời gian để con số này ra ..

+0

Điều này đã cho tôi. Chúc mừng. Trở lại tiêm setter! – Edward

1

Ngoài câu trả lời MonocroM, tôi đã cùng một vấn đề với lệnh của tôi và đã âm thầm bỏ qua bởi Symfony chỉ vì constructor lệnh của tôi có 1 số bắt buộc.

Tôi chỉ cần loại bỏ nó và gọi phương thức cha mẹ __construct() (Symfony 2.7) và nó làm việc tốt;)

1

Trong trường hợp của tôi nó đã phàn nàn về "công việc" không gian tên mặc dù WorkflowDumpCommand đã được cung cấp một cách chính xác bởi framework.

Tuy nhiên, nó không có sẵn để chạy vì tôi chưa xác định bất kỳ luồng công việc nào để phương thức isEnabled() của lệnh trả về false.

Các vấn đề liên quan