Ошибка с сохраненным методом при миграции - PullRequest
0 голосов
/ 18 ноября 2018

В моем приложении laravel 5.7 я использую Elasticsearch, а в модели я использую сохраненные и удаленные методы связанной Модели:

<?php

namespace App;

use DB;
use App\MyAppModel;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;

class Vote extends MyAppModel
{
    protected $table = 'votes';
    protected $elasticsearch_type  = 'vote';
    protected $primaryKey = 'id';
    public $timestamps = false;

    public function getTableName(): string
    {
        return $this->table;
    }



    protected static function boot() {
        parent::boot();

        static::deleted(function ($vote ) {
            // return; // TO UNCOMMENT
            $elastic = app(\App\Elastic\Elastic::class);
            $elasticsearch_root_index  = config('app.elasticsearch_root_index');
            $elasticsearch_type        = with(new Vote)->getElasticsearchType();
            $elastic->delete([
                'index' => $elasticsearch_root_index,
                'type' => $elasticsearch_type,
                'id' => $vote->id,
            ]);
        });

        static::saved(function ($vote) {
            // return; // TO UNCOMMENT
            $elastic = app(\App\Elastic\Elastic::class);
            $elasticsearch_root_index  = config('app.elasticsearch_root_index');
            $elasticsearch_type        = with(new Vote)->getElasticsearchType();

            $elastic->delete([
                'index' => $elasticsearch_root_index,
                'type'  => $elasticsearch_type,
                'id'    => $vote->id,
            ]);

            if ($vote->status == 'A') { // only active votes must be saved in elasticsearch
                $elastic->index([
                    'index' => $elasticsearch_root_index,
                    'type'  => $elasticsearch_type,
                    'id'    => $vote->id,
                    'body'  => [
                        'id'          => $vote->id,
                        'slug'        => $vote->slug,
                        'name'        => $vote->name,
                        'description' => $vote->description,
                    ]
                ]);
            } // if ($vote->status == 'A') { // only active votes must be saved in elasticsearch

Когда я изменяю свои данные в редакторе, все работает нормально, но с помощью команды сеялки

php artisan migrate:refresh --seed -v

Я получил ошибку:

...
Migrating: 2018_07_13_150151_create_votes_table

   Elasticsearch\Common\Exceptions\Missing404Exception  : {"_index":"select_vote","_type":"vote","_id":"2","_version":1,"result":"not_found","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":18,"_primary_term":23}

  at /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php:607
    603|             $exception = new AlreadyExpiredException($responseBody, $statusCode);
    604|         } elseif ($statusCode === 403) {
    605|             $exception = new Forbidden403Exception($responseBody, $statusCode);
    606|         } elseif ($statusCode === 404) {
  > 607|             $exception = new Missing404Exception($responseBody, $statusCode);
    608|         } elseif ($statusCode === 409) {
    609|             $exception = new Conflict409Exception($responseBody, $statusCode);
    610|         } elseif ($statusCode === 400 && strpos($responseBody, 'script_lang not supported') !== false) {
    611|             $exception = new ScriptLangNotSupportedException($responseBody. $statusCode);

  Exception trace:

  1   Elasticsearch\Connections\Connection::process4xxError([])
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php:279

  2   Elasticsearch\Connections\Connection::Elasticsearch\Connections\{closure}()
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/react/promise/src/FulfilledPromise.php:25

  3   React\Promise\FulfilledPromise::then(Object(Closure))
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php:55

  4   GuzzleHttp\Ring\Future\CompletedFutureValue::then(Object(Closure))
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/guzzlehttp/ringphp/src/Core.php:341

  5   GuzzleHttp\Ring\Core::proxy(Object(GuzzleHttp\Ring\Future\CompletedFutureArray), Object(Closure))
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php:299

  6   Elasticsearch\Connections\Connection::Elasticsearch\Connections\{closure}(Object(Elasticsearch\Connections\Connection), Object(Elasticsearch\Transport), [])
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php:177

  7   Elasticsearch\Connections\Connection::performRequest("DELETE", "/select_vote/vote/2", [], [], Object(Elasticsearch\Transport))
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php:110

  8   Elasticsearch\Transport::performRequest("DELETE", "/select_vote/vote/2", [], [])
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Client.php:1553

  9   Elasticsearch\Client::performRequest(Object(Elasticsearch\Endpoints\Delete))
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Client.php:265

  10  Elasticsearch\Client::delete([])
      /mnt/_work_sdb8/wwwroot/lar/Votes/app/Elastic.php:33

  11  App\Elastic\Elastic::delete(["select_vote", "vote"])
      /mnt/_work_sdb8/wwwroot/lar/Votes/app/Vote.php:142

  12  App\Vote::App\{closure}(Object(App\Vote))
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php:360

  13  Illuminate\Events\Dispatcher::Illuminate\Events\{closure}("eloquent.saved: App\Vote")
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php:209

  14  Illuminate\Events\Dispatcher::dispatch("eloquent.saved: App\Vote")
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php:162

  15  Illuminate\Database\Eloquent\Model::fireModelEvent("saved")
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:692

  16  Illuminate\Database\Eloquent\Model::finishSave([])
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:663

  17  Illuminate\Database\Eloquent\Model::save()
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:790

  18  Illuminate\Database\Eloquent\Builder::Illuminate\Database\Eloquent\{closure}(Object(App\Vote))
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Support/helpers.php:1027

  19  tap(Object(App\Vote), Object(Closure))
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:791

  20  Illuminate\Database\Eloquent\Builder::create()
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php:23

  21  Illuminate\Database\Eloquent\Model::forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), "create")
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1608

  22  Illuminate\Database\Eloquent\Model::__call("create")
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1620

  23  Illuminate\Database\Eloquent\Model::__callStatic("create")
      /mnt/_work_sdb8/wwwroot/lar/Votes/database/seeds/votesInitData.php:92

  24  votesInitData::run()
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29

  25  call_user_func_array([])
      /mnt/_work_sdb8/wwwroot/lar/Votes/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29

...

Если в сохраненных и удаленных методах раскомментировать, вернитесь, что все работает нормально (без возможности поиска вasticsearch). Почему ошибка и как это исправить? Есть ли способ проверить, что он вызывается из команды миграции и выхода? Может ли это решить проблему?

Спасибо!

1 Ответ

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

В аналогичном случае я устанавливаю флаг в своей таблице настроек в начале сценариев миграции, как

DB::table('settings')->insert([
    'name' => 'elastic_automation',
    'value' =>  'N',
]);

В последнем сценарии миграции я меняю ключ

Settings::where('name', 'elastic_automation')->update(['value' => 'Y']);

и япроверьте этот ключ в моей модели событий.Это работает для меня!

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