Artisan::call 命令包抛出错误异常将通过网页调用

Artisan::call command package throws error exception will calling through web page

我正在为 运行 一个 Laravel 项目使用 docker,并且我在 Laravel 中有这个命令写入存储文件夹中的文件

Artisan::call(
    'app:cache',
    [
        "--message" => 'this is a command', 
        "--seconds" => 0
    ]
)

当我像这样通过网络调用它时

Route::get('/', function () {
    \Artisan::call(
        'app:cache',
        [
            "--message" => 'this is a command', 
            "--seconds" => 0
        ]
    );
});

来自 /src/vendor/symfony/console/Input/ArrayInput.php 文件的异常生成并带有此消息:"Trying to access array offset on value of type int"

但在命令行中,此命令完全正常。

试着这样称呼它:

Artisan::call('app:cache --message="this is a command" --seconds=0');

如果您想在其中放入动态变量:

Artisan::call('app:cache --message=' . $yourMessage . '--seconds=' . $seconds);

您不必像这样在单个字符串行中传递变量来处理任何数组。它仍然使读取单个字符串变得简单。

问题出在我使用的 PHP 版本上,PHP 版本是 7.4.1,而 Laravel 用于此版本 PHP 的软件包] 被更改并导致错误发生,我将我的使用 PHP 版本更改为 7.2 并开始工作。 我已经给出了代码,但通常情况下,程序员不应该这样使用这种包,例如在这个中,WEB 不应该直接调用 Artisan 命令,因为如果发生这种情况,你将需要重写你的代码无处不在。相反,使用您自己的代码并将您想要的放在后面,例如:

想像你有这个 artisan 命令在文件中写入一些信息并且你想在你的 WEB 部分中使用它那么你必须将你的代码放入 class 或在你的外部函数中artisan 命令并在您的 artisan 和网络中使用您的 class/function 进行工作。然后像下面的代码

Route::get('/', function () {
    \Artisan::call(
        'app:cache',
        [
            "--message" => 'this is a command', 
            "--seconds" => 0
        ]
    );
});

会变成像

这样的代码
Route::get('/', function () {
    $cache = new \App\Custom\Cache(
        $message = 'this is a command',
        $seconds = 0
    );
});

通过这种方式,您的功能代码与您的框架分离,如果您甚至在 class/function 中使用了一些包并且需要像调用 Artisan 命令那样更改包,那么那里只是一个要更新的地方,而不是多个地方。