Где лучше запускать фильтрацию переданного текста комментария, для последующего сохранения?

Задача: реализовать возможность для некоторых групп пользователей оставлять ссылки в комментариях, для остальных - удалять ссылки.

Данные от пользователя попадают в контроллер,
public function store(StoreReviewRequest $request) {}

где они проходят валидацию, затем я получаю валидные данные: $validatedData = $request->validated();

Затем мне нужно применить фильтры к тексту отзыва/комментария, для этого я написал фильтр:
Filter

abstract class Filter
{
    protected $content;
    protected $filter;

    public function __construct($content,array $filters)
    {
        $this->content = $content;
        $this->filters = $filters;
    }

    public function apply()
    {
       // code
    }

}


TextFilter

class TextFilter extends Filter
{
    /**
     * Wrap links filter
     * 
     * @return void
     */
    public function wrapLinks()
    {
       // Code
    }
}


Написал гейт, с помощью которого я проверяю возможность пользователя оставлять ссылки в комментариях:

if(Gate::allows('useLinkInComments', $request->user()) {
  //code
}


И собственно, мне нужно в перед тем, как передать данные в модель, применить эти фильтры после проверки Gate. Делаю я это так:
new TextFilter($validatedData['message'],['wrap-links'])->apply();

Где это лучше делать? В контроллере? В таком случае (если будет расти логика) контроллер будет увеличиваться до больших размеров. Использовать хук afterValidation? Но вроде пишут что он чисто для кастомизации ошибок. Какие есть варианты правильного решения моей проблемы?
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
megakor
@megakor
Go/PHP developer | Вконтакте
Много способов как это сделать, но точно не в контроллере.
Я бы сделал CommentObserver:
php artisan make:observer CommentObserver --model=Comment

и там в методе saving(Comment $comment) проверял бы - есть ли право у пользователя (с помощью политики, а не гейта, кстати) и фильтровал бы как надо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы