Ошибка в получении laravel экземпляра эластичного поиска - PullRequest
0 голосов
/ 04 ноября 2018

В моем приложении Laravel 5.7 я хочу использовать эластичный поиск, и я нашел это https://michaelstivala.com/learning-elasticsearch-with-laravel/ статья. Во-первых, я хотел импортировать все данные из таблицы, которую я хочу использовать сasticsearch 1) Я создал файл оболочки app / Elastic.php с содержимым из githubusercontent. Это правильный каталог для этого файла?

2) В моей модели приложения / 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);

отстает от моего опыта в Laravel ...

Спасибо!

1 Ответ

0 голосов
/ 14 ноября 2018

Не столько вопрос о Laravel / Elasticsearch, сколько о пространстве имен PHP и автозагрузке PSR-4.

Если вы посмотрите файл composer.json вашего приложения Laravel, вы найдете sth. как

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

Это означает, что вы хотите следовать спецификации PSR-4 для пространств имен внутри вашего каталога /app. По сути это означает, что ваша структура папок должна соответствовать иерархии вашего пространства имен.

Следовательно, задача 1: Вы упомянули, что внутри /app/Elastic.php есть класс App\Elastic\Elastic. Этот класс не может быть загружен вашим автозагрузчиком PSR-4, он должен быть в /app/Elastic/Elastic.php ИЛИ быть объявленным в пространстве имен App\.

Проблема 2: При звонке

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

внутри пространства имен, например App/ разрешается до App/App, как говорится в ошибке. Чтобы избежать этого, используйте \App\Elastic\Elastic::class, как предлагает Anar, или импортируйте класс с помощью , используйте оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...