2015-03-24 9 views
5

Seit Laravel 5 ist es interessiert mich - wie Konsolenbefehl registrieren und 5.Wie man Konsolenbefehl vom Paket in Laravel 5 registriert?

Wie in laracast diskutieren https://laracasts.com/discuss/channels/tips/developing-your-packages-in-laravel-5 in Laravel von Paket zu verwenden, i eine Verzeichnisstruktur erstellen, mein Paket automatisch zu laden hinzufügen und erstellen Sie einen Dienst Anbieter

<?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' 
     ]; 
    } 
} 

Mein InstallCommand.php Skript in/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'); 
    } 

} 

I Anbieter in app.php & ausführen Dump-Autoload registrieren Dienst gespeichert. Aber wenn ich versuche,

php artisan eternaltree:install 

ausführen es mir zeigen

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

Ich glaube, mein Befehl nicht vom Dienstanbieter registriert ist, weil php Handwerker Liste nicht meinen Befehl zeigen. Kann mir jemand erklären, wie man Befehle in einem eigenen Paket in Laravel 5 richtig registriert?

Antwort

3

fand ich eine Entscheidung, es war einfach:

in registerInstallCommand()

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

Es ist kein Service-Container und ein Singleton zu verwenden, erforderlich. Sie können Ihre Befehlsklasse einfach in das $this->commands([]); Array in der register() Sektion Ihres Service Providers setzen.

wie folgt aus:

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

tat, wie Sie vorgeschlagen: - Implementiert MyServiceProvider erweitert Serviceprovider dann '' 'public function register() { // $ this-> Befehle ([ LaravelTypesController :: Klasse ]); } '' - LaravelTypesController erweitert Befehl mit $ Signatur, $ Beschreibung und Handle-Methode, aber immer noch nicht Befehl auf PHP Artisan | Grep –

-1

Besser spät als nie.

Sie haben versucht, eternaltree:install aufzurufen, aber Sie haben den Befehl als install:eternaltree registriert.

Ihre Antwort ist korrekt ... aber die Methoden registerCommands() und registerInstallCommands() waren nicht erforderlich. Halten Sie Ihren Code schlank, indem Sie einfach die commands() Methode innerhalb der register() Methode aufrufen.