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

how to add artisan command to my package laravel

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

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,那么我怎么能在我的包裹里做那个?

我在项目中的实现方式是在 app/Console/Kernel.php 中添加 Kernel.php class 扩展 ConsoleKernel,然后在单独的 [=36] 中添加命令及其功能=]es 在 app/Console/Commands/ 中,有一个受保护的变量签名 protected $signature = 'import:zip {path : Zip code file path}';,它包含命令 I'll post both kernel.php 和一个命令文件 here .

这就是我的 kernel.php 的样子

<?php
namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as 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

<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use 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,希望这对您有所帮助

编辑

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

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

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

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

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

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

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

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

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

确保你已经像

一样导入了你的命令
use vendor\package\Commands\SetupCommand;

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