Laravel获取ElasticSearch实例时出错

时间:2018-11-04 07:56:59

标签: elasticsearch laravel-5

在我的Laravel 5.7应用程序中,我想使用elasticsearch,我发现了这一点 https://michaelstivala.com/learning-elasticsearch-with-laravel/篇文章。 首先,我想从要与elasticsearch一起使用的表中导入所有数据 1)我创建了一个包装文件app / Elastic.php,其中的内容来自githubusercontent。这个文件的目录正确吗?

2)在我的模型app / Vote.php中,我添加了功能

公共静态函数bulkVotesToElastic() {

$elastic = app(App\Elastic\Elastic::class);

Vote::chunk(100, function ($Votes) use ($elastic) {
    foreach ($Votes as $Vote) {
        $elastic->index([
            'index' => 'select_vote',
            'type' => 'vote',
            'id' => $Vote->id,
            'body' => $Vote->toArray()
        ]);
    }
});

}

因为我有种子填充器,用于填充初始数据。但是调用此方法时出现错误:

Class App\App\Elastic\Elastic does not exist

为什么出错以及如何解决?

实际上这行

$elastic = app(App\Elastic\Elastic::class);

是我的幼虫经验的背后...

谢谢!

1 个答案:

答案 0 :(得分:1)

与Laravel / Elasticsearch无关,而与PHP命名空间和PSR-4自动加载有关。

如果您查看Laravel应用的composer.json文件,您会发现……。喜欢

"autoload": {
    "psr-4": {
        "App\\": "app/"
    }
}

这意味着您要遵循/app目录中名称空间的PSR-4规范。基本上,这意味着您的文件夹结构必须与名称空间层次结构相对应。

因此,问题1:您提到App\Elastic\Elastic中有一个/app/Elastic.php类。您的PSR-4自动加载器无法加载此类,它应在/app/Elastic/Elastic.php的{​​{1}}或命名空间App\中声明。

问题2:致电

$elastic = app(App\Elastic\Elastic::class);

在名称空间中,例如App/会按照错误说明解析为App/App。 为避免这种情况,请按照Anar的建议使用\App\Elastic\Elastic::class,或通过 use 语句导入类。