Как разруливать права доступа в зависимости от роли пользователя?
Чтобы не городить кучу методов для выборки на каждый случай жизни, я бы сделал скоуп, который принимал бы пользователя в качестве аргумента и фильтровал записи в зависимости от пермишенов. Тогда выборка контрактов всегда будет "чистой", типаContract::withPermission($user)->get();
В скоупе уже придется прописать фильтры по пермишенам.
Да, может это и не бест практис, но ведь работает. Теоретически, конечно, такого не приходилось реализовывать еще.
Вам должны помочь вотеры - https://symfony.com/doc/current/security/voters.html