如何将artisan命令添加到我的包laravel

时间:2017-05-29 09:38:21

标签: php laravel laravel-5 laravel-5.2 laravel-5.1

所以我在Laravel 5.4中开发了一个自定义包,我添加了我的路由,我的控制器,但我不知道如何添加工匠命令,这是我的代码:

namespace MyPackage;

use Illuminate\Support\ServiceProvider;

class MyPackageServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        include __DIR__.'/routes.php';
    }

    /**
    * Register the application services.
    *
    * @return void
    */
    public function register()
    {
      $this->app->make('MyPackage\Controllers\MyPackageServiceController');
    }
}

通常在通常情况下我会添加一个新的artisan命令并将其添加到 app / Console / Commands / Kernel.php ,那么我该如何在我的包中做到这一点?

3 个答案:

答案 0 :(得分:2)

我在我的项目中实现的方法是在Kernel.php内添加app/Console/Kernel.php类,扩展ConsoleKernel,然后在app/Console/Commands/内的不同类中添加命令及其功能,是一个受保护的变量签名protected $signature = 'import:zip {path : Zip code file path}';,它保存了命令,我将在这里发布kernel.php和一个命令文件。

这就是我的kernel.php的样子

命名空间App \ Console;

使用Illuminate \ Console \ Scheduling \ Schedule; 使用Illuminate \ Foundation \ Console \ Kernel作为ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\ProcessZip5UniqueChanges::class,
        \App\Console\Commands\ProcessZip5NonUniqueChanges::class,
        \App\Console\Commands\ImportZipCodes::class
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')
        //          ->hourly();
    }

    /**
     * Register the Closure based commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        require base_path('routes/console.php');
    }
}

这是我的一个命令\App\Console\Commands\ProcessZip5UniqueChanges::class

命名空间App \ Console \ Commands;

使用Illuminate \ Console \ Command; 使用Illuminate \ Database \ QueryException;

class ImportZipCodes extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'import:zip {path : Zip code file path}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Import zip codes';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $path = $this->argument('path');
        if(file_exists($path)){
            $this->import($path);
        } else {
            $this->error('File not exists');  
        }        
    }

现在我可以运行php artisan import:zip /path/to/the/uploaded/file,希望这有帮助

修改

在打包时尝试这样,因为命令应该是自动加载的

namespace Vendor\Package;

class MyServiceProvider extends ServiceProvider {

    protected $commands = [
        'Vendor\Package\Commands\MyCommand::Class',
        'Vendor\Package\Commands\FooCommand::Class',
        'Vendor\Package\Commands\BarCommand::Class',
    ];

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

答案 1 :(得分:1)

您可以像任何其他类一样绑定它,但前缀为command.到实际的命令名。

如果你的命令名是mycommand,那么注册就是这样。

$this->app->singleton('command.mycommand', function () {
    return new MyCommand;
});

根据laravel如何注册它的命令找到此信息。

vendor/laravel/framework/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php

答案 2 :(得分:0)

对于Laravel 5.3及更高版本,在PackageServiceProvider的启动方法中添加以下内容。确保将“ SetupCommand”更改为您的命令类名称

if ($this->app->runningInConsole()) {
        $this->commands([
        SetupCommand::class
    ]);
}

确保已导入命令,如

use vendor\package\Commands\SetupCommand;

安装软件包后,您将在php artisan命令列表中找到命令