<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-04-20
* Time: 16:44
*/
namespace App\ParamConverter;
use App\Entity\Location\City;
use App\Repository\CityRepository;
use App\Service\DefaultCityProvider;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class CityParamConverter implements ParamConverterInterface
{
public function __construct(
protected CityRepository $cityRepository,
protected DefaultCityProvider $defaultCityProvider
) {}
/**
* @inheritDoc
*/
public function apply(Request $request, ParamConverter $configuration): bool
{
$param = $configuration->getName();
$uriIdentity = $request->attributes->get($param, null);
if (null === $uriIdentity) {
$city = $this->defaultCityProvider->getDefaultCity();
} else {
$city = $this->cityRepository->ofUriIdentity($uriIdentity);
}
if (null === $city) {
throw new NotFoundHttpException(sprintf('City with URI identity %s was not found.', $uriIdentity));
}
$request->attributes->set($param, $city);
return true;
}
/**
* @inheritDoc
*/
public function supports(ParamConverter $configuration): bool
{
if (null === $configuration->getClass()) {
return false;
}
return City::class === $configuration->getClass() || is_subclass_of($configuration->getClass(), City::class);
}
}