<?php declare(strict_types=1);
namespace Swag\EnterpriseSearch\Search\Page;
use Shopware\Core\Content\Category\Exception\CategoryNotFoundException;
use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Swag\EnterpriseSearch\Search\MultiSearchGatewayInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
class SearchPageLoader
{
/**
* @var GenericPageLoaderInterface
*/
private $genericLoader;
/**
* @var MultiSearchGatewayInterface
*/
private $searchGateway;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
public function __construct(
GenericPageLoaderInterface $genericLoader,
MultiSearchGatewayInterface $searchGateway,
EventDispatcherInterface $eventDispatcher
) {
$this->genericLoader = $genericLoader;
$this->searchGateway = $searchGateway;
$this->eventDispatcher = $eventDispatcher;
}
/**
* @throws CategoryNotFoundException
* @throws InconsistentCriteriaIdsException
* @throws MissingRequestParameterException
*/
public function load(Request $request, SalesChannelContext $salesChannelContext): SearchPage
{
$page = $this->genericLoader->load($request, $salesChannelContext);
$page = SearchPage::createFrom($page);
if (!$request->query->has('search')) {
throw new MissingRequestParameterException('search');
}
$result = $this->searchGateway->search($request, $salesChannelContext);
$page->setSearchResult($result);
$page->setSearchTerm($this->getTerm($request));
$this->eventDispatcher->dispatch(
new SearchPageLoadedEvent($page, $salesChannelContext, $request)
);
return $page;
}
private function getTerm(Request $request): string
{
$term = $request->query->get('search');
if (\is_array($term)) {
$term = implode(' ', $term);
}
return trim((string) $term);
}
}