Как определить политику для списка или массива в laravel? - PullRequest
1 голос
/ 16 мая 2019

У меня есть следующая политика, которая определяет, может ли пользователь просматривать контракт.

public function view(User $user, Contract $contract)
    {
        if ($user->user_type->id == 2) { // If user is a vecino
            if ($user->id == $contract->customer_id) {
                return true;
            }
        } else if ($user->user_type->is_admin == true) { // If user is an admin
            return true;
        }

        return false;
    }

Который затем проверяется на авторизацию с помощью

$this->authorize('view', $contract);

Как проверить авторизацию для списка / массива / коллекции? Например, если я получу список контрактов через Contract::all()

Я не нашел способа сделать это. Я мог бы сделать цикл и вызвать $ this-> authorize для каждой итерации, чтобы проверить авторизацию, но это может повлиять на производительность.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Конструкция, которую я часто вижу в этом случае, заключается не в проверке всех контрактов, если у пользователя есть на это разрешение.

Вместо того, чтобы отфильтровывать контракты с политиками, обычно я видел в проектах, в которых работалВы фильтруете контракты в запросе.Это происходит главным образом потому, что если вы хотите выполнить разбивку на страницы вниз, вы хотите выполнить всю фильтрацию перед выполнением запроса, чтобы избежать появления странных данных разбивки на страницы. Если вы удалите половину контрактов в качестве примера с политиками, данные разбивки на страницы будут противоречивыми.

Там для выполнения следующего предложения запроса можно получить это.

Contract::where('user_id', $user->id)->get();

Вариант этого, который я обычно делаю, чтобы упростить для себя сам, - это создание области действия в пользовательской модели.

public function scopeOwned($query, User $user)
{
    return $this->query->where('user_id', $user->id);
}

Contract::owned($user)->get();
0 голосов
/ 16 мая 2019

Вы должны зацикливаться, один путь к другому. Нет никакой разницы между циклом объекта Contract в вашем контроллере или в вашей политике, но политики создаются для проверки одного ресурса, поэтому я бы сделал это в вашем контроллере.

...