所以我在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 ,那么我该如何在我的包中做到这一点?
答案 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命令列表中找到命令