2015-03-24 25 views
5

Vì Laravel 5, tôi quan tâm đến cách đăng ký và sử dụng lệnh giao diện điều khiển từ gói trong Laravel 5.Cách đăng ký lệnh console từ gói trong Laravel 5?

Như trong báo cáo sơ đồ, hãy thêm gói của tôi để tự động tải và tạo dịch vụ nhà cung cấp

<?php namespace Goodvin\EternalTree; 

use Console\InstallCommand; 
use Illuminate\Support\ServiceProvider; 

class EternalTreeServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 

    } 

    public function register() 
    { 
     $this->registerCommands(); 
    } 

    protected function registerCommands() 
    { 
     $this->registerInstallCommand(); 
    } 

    protected function registerInstallCommand() 
    { 
     $this->app->singleton('command.eternaltree.install', function($app) { 

      return new InstallCommand(); 
     }); 
    } 

    public function provides() 
    { 
     return [ 

      'command.eternaltree.install' 
     ]; 
    } 
} 

My InstallCommand.php kịch bản lưu trữ trong/src/Console

<?php namespace Goodvin\EternalTree\Console; 

use Illuminate\Console\Command; 
use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Console\Input\InputArgument; 

class InstallCommand extends Command { 

    protected $name = 'install:eternaltree'; 
    protected $description = 'Command for EternalTree migration & model install.'; 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function fire() 
    { 
     $this->info('Command eternaltree:install fire'); 
    } 

} 

tôi đăng ký cung cấp dịch vụ trong app.php & thực hiện tự đổ autoload. Nhưng khi tôi cố gắng để thực hiện

php artisan eternaltree:install 

nó chỉ cho tôi

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

Tôi nghĩ rằng lệnh của tôi không được đăng ký bởi nhà cung cấp dịch vụ, bởi vì danh sách php thợ thủ công không hiển thị lệnh của tôi. Bất cứ ai có thể giải thích cho tôi những gì là đúng cách để đăng ký các lệnh trong gói riêng trong Laravel 5?

Trả lời

3

Tôi tìm thấy một quyết định, nó rất đơn giản:

trong registerInstallCommand() Thêm

$this->commands('command.eternaltree.install'); 
18

Nó không phải là cần thiết để sử dụng một container dịch vụ và một singleton. Bạn có thể chỉ cần đặt lớp lệnh của bạn vào mảng $this->commands([]); vào phần register() của nhà cung cấp dịch vụ của bạn.

Giống như rằng:

$this->commands([ 
    Acme\MyCommand::class 
]); 
+1

Did như Bạn gợi ý: - MyServiceProvider thực hiện kéo dài ServiceProvider sau đó '' 'public function đăng ký() { // $ this-> lệnh ([ LaravelTypesController :: lớp ]); } '' ' - LaravelTypesController mở rộng Lệnh với $ signature, $ description và phương thức xử lý, nhưng vẫn không thấy lệnh trên php artisan | grep –

-1

Muộn còn hơn không bao giờ.

Bạn đang cố gắng gọi eternaltree:install nhưng bạn đã đăng ký lệnh dưới dạng install:eternaltree.

Câu trả lời của bạn là chính xác ... nhưng không cần thiết cho các phương thức registerCommands()registerInstallCommands(). Giữ mã của bạn gọn gàng bằng cách chỉ cần gọi phương thức commands() từ trong phương thức register().

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