比方说,我想在php artisan migrate
的基础上增加几个选项:
php artisan migrate --core
php artisan migrate --project=0f9ebA2
可以扩展现有的 artisan 指挥部吗?我不想更改任何默认行为,只想添加选项.只要有一个包装类预先设置某些选项就足够了,比如更改配置变量或添加路径参数,然后像往常一样将其他所有内容传递给artisan函数.
go 掉php artisan migrate --core
,看起来大概是这样的:
public function handle() {
$this->call('migrate', ['--path' => '/database/migrations/core', ...$this->arguments()]);
}
go 掉php artisan migrate --project=0f9ebA2
,看起来大概是这样的:
public function handle() {
config(['tenant.key' => $this->argument('--project')]);
$this->call('migrate', ['--path' => '/database/migrations/project', ...$this->arguments()]);
}
Laravel的文档只关注于编写自定义命令,偶尔也会用$this->call()
来调用其他命令--它似乎没有涵盖扩展现有功能或传递参数.
Already Tried / Doesn't Work:个
- 创建一个单独的定制命令,如
php artisan migrate:core
.这将完全适用于我希望添加的功能,而不是其他功能-它不会保留migrate
‘S的任何其他选项,这些选项也是必需的.我们的目标是为S的核心功能设定背景. - 手动通过自定义命令传递参数,如上面的示例所示.我可以使用
$this->arguments()
获取现有的参数,并将它们重新附加到内部Artisan调用,但每个参数也需要在定制命令的定义中-try 传递不在命令定义的参数中的参数会导致命令被拒绝.似乎没有一种方法可以仅通过通配符.当然,我可以复制-粘贴迁移的现有参数定义,但它不能灵活地处理future 的任何核心更改或第三方包. - 创建一个直接扩展为
migrate
的新自定义命令.try 一个基本migrate
的概念验证别名:
namespace App\Console\Commands;
use Illuminate\Database\Console\Migrations\MigrateCommand;
class MigrateCore extends MigrateCommand {
protected $signature = 'migrate:core';
public function handle() {
parent::handle();
}
}
结果是,拉威尔的核心层次 struct 更高,得分高达BindingResolutionException
分:
Target [Illuminate\Database\Migrations\MigrationRepositoryInterface] is not instantiable while building [App\Console\Commands\MigrateCore, Illuminate\Database\Migrations\Migrator]
对我来说,这感觉就像走上了一条意想不到的道路.