<?php declare(strict_types=1);
namespace Swag\EnterpriseSearch\Search;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Framework\Page\StorefrontSearchResult;
use Swag\EnterpriseSearch\Configuration\GatewayNotConfiguredException;
use Swag\EnterpriseSearch\Configuration\ZeroLimitException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
class MultiSearchGateway implements MultiSearchGatewayInterface
{
/**
* @var SearchGatewayInterface[]
*/
private $searchGateways;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
public function __construct(
\Traversable $searchGateways,
EventDispatcherInterface $eventDispatcher
) {
$this->searchGateways = iterator_to_array($searchGateways);
$this->eventDispatcher = $eventDispatcher;
}
public function search(Request $request, SalesChannelContext $salesChannelContext): MultiSearchResult
{
$multiSearchResult = new MultiSearchResult();
$this->eventDispatcher->dispatch(
new MultiSearchGatewayEvent(
$request,
$salesChannelContext,
$multiSearchResult
)
);
foreach ($this->searchGateways as $entityName => $gateway) {
try {
$storeFrontSearchResult = StorefrontSearchResult::createFrom($gateway->search($request, $salesChannelContext));
$multiSearchResult->addSearch($storeFrontSearchResult, $entityName);
} catch (GatewayNotConfiguredException | ZeroLimitException $e) {
//nth
}
}
return $multiSearchResult;
}
}