на каком-то проекте мы делали менеджер способв фильтрации.
FilterManager - позволяет регистрировать в себе фильтры, каждый тип фильтра = 1 объекту с методами: Получить содержимое фильтра для сборки, Получить текущее значение фильтра, отвечает за регистрацию колбэка,передаваемого во where фильтруемой модели.
filters/DateFilter - объект фильтрации по датам
filters/PriceFilter - объект фильтрации по цене
По интерфейсу примерно так выглядел каждый объект строителей типа фильтра
interface FilterBuilder
{
public function getAttributes(): array;
public function build(): self;
public function getData(): ?Collection;
}