Синхронизация отношений «многие ко многим» в слушателе событий (Laravel 5.7) - PullRequest
0 голосов
/ 06 января 2019

Laravel App имеет роли, и у каждого Role есть разрешения (от многих ко многим)

Каждый пользователь имеет несколько ролей (от многих ко многим)

Когда права Роли изменяются / обновляются, запускается Событие RolePermissionsChanged, и слушатель имеет следующий код:

public function handle(RolePermissionsChanged $event)
{
     $role_permissions=$event->role()->permissions;
     foreach ($event->role()->users as $user) {
        $user->permissions()->sync($role_permissions);
      }
}

Это должно обновить permission_user таблицу для синхронизации ролей с пользователем. Когда событие инициируется, задание завершается с ошибкой:

Method Illuminate\Database\Eloquent\Collection::sync does not exist.

Если я изменю строку в цикле foreach на App\User::find($user->id)->permissions()->sync($role_permissions);, она будет работать, но я знаю, что это нужно сделать другим способом. Кто-нибудь может направить меня туда, куда я иду не так.

Edit:

Ниже RolePermissionsChanged::class

<?php

namespace App\Events\Auth;

use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use App\Role;

class RolePermissionsChanged
{
    use Dispatchable, SerializesModels;

    public $role;

    public function __construct(Role $role)
    {
        $this->role=$role;
    }

}

1 Ответ

0 голосов
/ 06 января 2019

$event->role() должно быть $event->role, это открытое свойство, определенное в классе событий, где $event->role() обрабатывает его как вызов функции.

public function handle(RolePermissionsChanged $event)
{
    $permission_ids = $event->role->permissions->pluck('id')->toArray();

    $event->role->users->each(function (User $user) use ($permission_ids) {
        $user->permissions()->sync($permission_ids);
    });
}
...