Laravel 5.8 синхронизация / присоединение / отключение событий - PullRequest
1 голос
/ 28 марта 2019

Laravel 5.8 должен отправлять события синхронизации, присоединения и отсоединения (https://laravel.com/docs/5.8/releases поиск Промежуточных событий таблицы / сводной модели * секция 1006 *).

ОБНОВЛЕНИЕ : примечания к выпуску были обновлены после публикации этого вопроса (дополнительная информация: https://github.com/laravel/framework/issues/28050 - https://github.com/laravel/docs/pull/5096).

Я попробовал, но следующий код выдает исключение:

Вызов неопределенного метода App \ ProjectUser :: syncing ()

ПРИМЕЧАНИЕ: поскольку Laravel 5.8 должен отправлять событие синхронизации, я не хочу использовать внешний пакет.

class User extends Model
{
    public function projects()
    {
        return $this->belongsToMany(\App\Project::class)->using(\App\ProjectUser::class);
    }
}

class Project extends Model
{
    public function users()
    {
        return $this->belongsToMany(\App\User::class)->using(\App\ProjectUser::class);
    }
}

class ProjectUser extends Pivot
{
    public static function boot()
    {
        parent::boot();

        static::syncing(function ($item) {
            dd('syncing event has been fired!');
        });
    }
}

// web.php
$project = \App\Project::first();
$project->users()->sync([1,2]);

Я пытался переместить метод загрузки с ProjectUser на User и Project, но получаю то же исключение.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Если метод отсоединения вызывается без идентификаторов (для отсоединения всех отношений), события не запускаются

https://github.com/laravel/framework/pull/27571#issuecomment-493451259

Я попытался по-разному решить эту проблему, но это невозможнобез использования внешнего пакета или переопределения многих методов.

Я выбираю chelout / laravel-relations-events пакет.

Он выглядит чистым и нестабильным.И использовать с чертой.

1 голос
/ 29 марта 2019

На Laravel 5.8, когда вы используете методы sync, attach или detach, будут запущены соответствующие события модели (создание, обновление, сохранение, ...) для вызываемого действия.Обратите внимание, что использование sync, attach или detach не приведет ни к какому событию, как синхронизация , присоединение или отключение .

В частности, последовательность событий, запускаемых для каждого элемента, передаваемого методу sync:

  • сохранение
  • создание
  • создание
  • сохранено

Последовательность событий для каждого элемента, переданного методу attach:

  • сохранение
  • создание
  • созданный
  • сохраненный

Последовательность событий для каждого элемента, переданного методу detach:

  • удаление
  • удалено

Таким образом, если вы хотите наблюдать за операцией синхронизации, вам действительно нужно наблюдать событие сохранения (или сохранения) из сводной модели (в данном случае ProjectUser):

class ProjectUser extends Pivot
{
    public static function boot()
    {
        parent::boot();

        static::saving(function ($item)  {
            // this will die and dump on the first element passed to ->sync()
            dd($item);
        });
    }
}

Рабочий пример https://github.com/danielefavi/laravel-issue-example

Больше информации по этому вопросу https://github.com/laravel/framework/issues/28050

Примечания к выпуску вводят в заблуждение, и они имеют бизменилось https://github.com/laravel/docs/pull/5096.

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