Как спроектировать следующую логику? есть страница поиска отображаемая 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
205 +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 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир