使用参数执行 Artisan 命令

Executing Artisan command with arguments

目前我面临以下问题:

我想在我的数据库更新后自动更新我的搜索索引。 我在 AppServiceProvider:

的表上注册了一个 saved() 侦听器
\App\Customer::saved(function(\App\Customer $customer) {
    // Update search index here
 });

在闭包内,我尝试调用一个 Artisan 命令 (scout:import),将 App\\Customer 传递给命令。我试过了

Artisan::queue('scout:import', ['' => 'App\\Customer']);
// Fails with message: Uninitialized string offset: 0

Artisan::queue('scout:import', ['model' => 'App\\Customer']);
// Fails: Cannot redeclare class App\Customer

Artisan::queue('scout:import', ['App\\Customer']);
// Fails: Not enough arguments (missing: "model")

我没有找到有关在官方文档中放置所需参数的信息。

我确定它非常简单(就像 laravel 中的所有内容一样)但我无法完成...

试试这个:

\App\Customer::saved(function(\App\Customer $customer, $input) {
    // Update search index here
});

Artisan::queue('scout:import {input}', ['App\\Customer']);

正确的格式是:

Artisan::queue('email:send', [
    'user' => 1, '--queue' => 'default'
]);

根据:https://laravel.com/docs/5.3/artisan#programmatically-executing-commands

我想说你的中间示例可能最接近,并且正在使用正确的参数执行命令,但在表面之下还有其他事情发生。

编辑

只是做了更多的挖掘,你需要参考控制台命令的签名,这在表面上实际上并不明显。在你的情况下,你需要参考这个控制台命令:

https://github.com/laravel/scout/blob/2.0/src/Console/ImportCommand.php

请注意签名标有 {model}

所以你的命令看起来像:

Artisan::queue('scout:import', ['model' => 'App\\Customer']);

另一个使用controller make命令的例子,注意这次我们使用签名段{name}:

Artisan::call('make:controller', ['name'=>'FOOBAR']);

同样,这里可能存在潜在问题 - 您应该直接从 console/terminal 尝试 运行 导入命令,看看是否遇到同样的问题。

您不需要使用 artisan 调用与 algolia 同步。 参考 algolia 文档:

Algolia Laravel Doc

'每次修改模型时,Laravel 都会发出一个事件。 Scout 正在侦听该事件,通知您的应用程序对 Algolia 进行 HTTP 调用以更新其索引。 您没有其他事情可做,请像往常一样使用您的可搜索 class'