用参数执行Artisan命令

时间:2017-01-17 08:00:44

标签: laravel artisan laravel-scout

目前我正面临以下问题:

我希望在更新数据库后自动更新搜索索引。 我在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中的所有东西一样)但是我无法完成它......

感谢您在advande的帮助!

3 个答案:

答案 0 :(得分:1)

正确的格式是:

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

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

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

修改

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

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']);

同样,这里可能存在一个潜在的问题 - 你应该尝试直接从控制台/终端运行import命令,看看你是否遇到了同样的问题。

答案 1 :(得分:0)

试试这个:

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

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

答案 2 :(得分:0)

您不需要使用工匠电话与阿尔戈利亚同步。 请参阅algolia文档:

Algolia Laravel Doc

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