Как спроектировать следующую логику? есть страница поиска отображаемая SearchControllerom
есть сам сервис поиска SearchService::search( $params ) внутри которого реализована логика сортировки, пагинации и еще много другой логики которая будет одинакова для всех проектов
базывое параметры поиска будут менятся от проекта к проекту
сейчас это как-то такclass SearchController extends Controller
{
private function getParameterForSearchQuery()
{
return [ "type"=>["post","folder","group"], "subtree"=>"events" ];
}
public function indexAction()
{
. . .
. . .
$this->render('::index.html.twig', $this->searchService->search( $this->getParameterForSearchQuery() ) );
}
}
короче я сделал чтоб в последующих проектах можно было пронаследовать этот контролер и перепределить одно лишь свойство
getParameterForSearchQuery() { return ["type"=>"file"] }
на сколько это правильно/неправильно?
подскажите лучшую практику. паттерны и т д
спасибо

21 Авг 2019 в 07:02
174 +1
0
Ответы
1

Для решения данной задачи можно использовать паттерн Стратегия.

Создайте интерфейс SearchParametersInterface, который будет определять метод для получения параметров поиска:

interface SearchParametersInterface
{
public function getParameters(): array;
}

Затем реализуйте классы, которые будут предоставлять конкретные параметры поиска:

class DefaultSearchParameters implements SearchParametersInterface
{
public function getParameters(): array
{
return [ "type"=>["post","folder","group"], "subtree"=>"events" ];
}
}
class CustomSearchParameters implements SearchParametersInterface
{
public function getParameters(): array
{
return [ "type"=>"file" ];
}
}

Измените ваш SearchController следующим образом:

class SearchController extends Controller
{
private $searchParameters;
public function __construct(SearchParametersInterface $searchParameters)
{
$this->searchParameters = $searchParameters;
}
public function indexAction()
{
//...
$this->render('::index.html.twig', $this->searchService->search($this->searchParameters->getParameters()));
}
}

Теперь в вашем приложении вы можете создавать экземпляры SearchController с различными параметрами поиска:

$searchControllerDefault = new SearchController(new DefaultSearchParameters());
$searchControllerCustom = new SearchController(new CustomSearchParameters());

Это позволит легко изменять параметры поиска в разных проектах, сохраняя принципы SOLID (открытость/закрытость, принцип подстановки Барбары Лисков и т. д.).

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 91 947 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир