比方说,我想在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]

对我来说,这感觉就像走上了一条意想不到的道路.

推荐答案

try 将其添加为app/Console/Commands/MigrateCore.php:

<?php

namespace App\Console\Commands;

use Illuminate\Database\Console\Migrations\MigrateCommand;

class MigrateCore extends MigrateCommand {
    public function __construct()
    {
        $migrator = app("migrator");
        $dispatcher = app("events");
        $this->signature .= "{--core : Run core migrations}";
        parent::__construct($migrator, $dispatcher);
    }

    public function handle(): void
    {
        if ($this->option("core")) {
            $this->input->setOption("path", "database/migrations/core");
        }
        parent::handle();
    }
}

您收到的错误:

目标[Illuminate\Database\Migrations\MigrationRepositoryInterface]在构建时不可实例化[应用程序\控制台\命令\迁移核心,照亮\数据库\迁移\迁移程序]

相当神秘,但如果您查看抛出错误的Illuminate\Container\Container中的注释,它开始有一些意义:

// If the type is not instantiable, the developer is attempting to resolve
// an abstract type such as an Interface or Abstract Class and there is
// no binding registered for the abstractions so we need to bail out.

Illuminate\Database\Console\Migrations\MigrateCommand的构造函数希望被注入Illuminate\Database\Migrations\Migrator的实例,而Illuminate\Database\Migrations\Migrator的实例又在寻找Illuminate\Database\Migrations\MigrationRepositoryInterface.但还没有具体的类绑定到该接口.

因此,我们使用app()帮助程序初始化这些绑定,然后将它们传递给构造函数,而不是仅仅从Illuminate\Database\Console\Migrations\MigrateCommand继承构造函数.

this Laracasts post得到了一点帮助.

Php相关问答推荐

此行动未经授权.升级Laravel时

PHP测试字符串的所有POST值

通过访问单个产品页面更新WooCommerce产品元数据

使用MySQLi使用连接字符串设置字符集

根据WooCommerce中的客户计费国家/地区更改产品价格

是否使用联系人表单7 wpcf7_Feedback_Response输出答复中的html?

模式 bootstrap 未显示

如何使用barryvdh/laravel-Snappy在两个打印页面上将表格分成两部分?

在 WooCommerce 中应用优惠券时显示购物车商品折扣金额

如果 Select 的县不是store 所在的县,如何隐藏本地自提?

使用 foreach php 将记录正确分配给正确的父级

使用产品自定义字段作为 WooCommerce 中特定用户角色的折扣百分比

Laravel 添加到经过身份验证的用户的数据将应用于每个查询

PHP 简单 XML Xpath 上移树(带有名称的父级)

将Shopware 6后端中定义的值导入MultiFilter

如何在构建 PHP 类别数组树的递归函数中将父面包屑传递给子项?

转发和非转发呼叫 - 后期静态绑定

如何限制for循环php中的条目数

Php 的新WeakMap - 枚举曾经被垃圾收集过吗?

如果 static:: 被解析为B,为什么 PHP 会执行A的方法