Как получить список всех пользователей, которые проходят определенную политику? - PullRequest
0 голосов
/ 27 февраля 2019

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

use App\Models\User;
use Illuminate\Support\Facades\Gate;

// ...

$notifiables = User::all()->filter(function(User $user) use($event) {
    return Gate::forUser($user)->allows('view', $event->project);
});

Это работает.Но когда в моей системе 1000 пользователей и 5 из них могут просматривать проект, я перебираю более 995 пользователей даром.
И так как событие и слушатель работают синхронно, пользователь, добавляющий проект, долженподождите, пока это не произойдет.

Как я могу ускорить это?

Редактировать: Хорошо, можно поставить слушателей в очередь.Однако было бы здорово улучшить этот код.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы можете использовать черту уведомлений laravel, чтобы позволить подписанному пользователю получать уведомления.Эти уведомления могут быть поставлены в очередь для последующей обработки, отправлены по электронной почте / sms / slack, сохранены в БД или использованы для трансляции сообщений, как в вашем случае использования.

Создать новое уведомление

php artisan make:notification InvoicePaid

Использование уведомляемого признака

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;
}

Теперь у пользователя есть метод уведомить , который принимает уведомление какАргумент

use App\Notifications\InvoicePaid;

$user->notify(new InvoicePaid($invoice));

https://laravel.com/docs/5.8/notifications

Учебное пособие: https://code.tutsplus.com/tutorials/notifications-in-laravel--cms-30499

0 голосов
/ 27 февраля 2019

Я не знаком с Фасадом Ворот, но если он в модели с отношениями, вы можете использовать whereHas:

$users = App\User::whereHas('permissions', function ($q) use ($event) {
    $q->where('name', 'view')->where('model_id', $event->project->id);
})->get();

https://laravel.com/docs/5.7/eloquent-relationships#querying-relationship-existence

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