Как спроектировать следующую логику? есть страница поиска отображаемая 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"] } на сколько это правильно/неправильно? подскажите лучшую практику. паттерны и т д спасибо
Для решения данной задачи можно использовать паттерн Стратегия.
Создайте интерфейс 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 (открытость/закрытость, принцип подстановки Барбары Лисков и т. д.).
Для решения данной задачи можно использовать паттерн Стратегия.
Создайте интерфейс 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 (открытость/закрытость, принцип подстановки Барбары Лисков и т. д.).