DJZT
@DJZT
Laravel - code for you

Как написать глобальный scoup?

Добрый вечер. Столкнулся с проблемой. Задача у меня стоит следующая. В зависимости от роли пользователя делать фильтрацию выборки Users моделей по некоторым критериям. Я решил написать для этого global Scope. Я вижу, что это самое правильное решение. Так как это дополнительное правило должно работать всегда, во всех запросах по Users.

В документации написано что скоуп надо активировать в boot методе модели. НО как я могу сделать фильтр по текущему пользователи и его роли, если ещё модели даже не проинициализировались.

if ($user->role->slug == 'moderator') {
    $builder->where('....');
} elseif ($user->role->slug == 'member') {
    $builder->where('....');
}
  • Вопрос задан
  • 496 просмотров
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
В буте ты только регистрируешь скоуп, там никаких манипуляций не происходит. Происходят они только при запросе в базу, а в этом случае модель уже является instance'ом.

Весь код сюда не влезет, но вкратце - используй отдельные классы global scope'ов. https://laravel.com/docs/5.3/eloquent#global-scopes

/* PSEUDO CODE */
class RoleScope
apply blablabla

class MyModel
boot addGlobalScope new RoleScope

Не знаю почему, но Laravel передает instance модели только в классы, а в анонимные нет. Там дальше разберешься)

А вообще - используй Bouncer для ролей и пермишенсов. Мало того, что он использует встроенные возможности ларавель в виде гейтов, так еще и поддерживает морф сущностей и еще дофига всяких плюшек. Законно называю его лучшим представителем в своем роде и рекомендую к использованию!)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы