Проблема, которую я обнаружил, заключается в том, что ParamConverter использует последний элемент в аннотациях.Если он соответствует маршруту fruit_show
, переменная $ food является экземпляром класса AppBundle: Vegetable.То же самое, если он совпадает с маршрутом vegetable_show
.
class FoodController
{
/**
* @Route("/items/fruits/{id}", methods={"GET"}, name="fruits_show")
* @ParamConverter("food", class="AppBundle:Fruit")
* @Route("/items/vegetables/{id}", methods={"GET"}, name="vegetables_show")
* @ParamConverter("food", class="AppBundle:Vegetable")
*/
public function foodAction(Request $request, $food)
{
//
}
}
Один из способов, который вы можете использовать, - это написать собственный ParamConverter:
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface;
use Symfony\Component\HttpFoundation\Request;
class FoodConverter implements ParamConverterInterface
{
protected $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function apply(Request $request, ParamConverter $configuration)
{
$id = $request->get('id');
$route = $request->get('_route');
$class = $configuration->getOptions()[$route];
$request->attributes->set($configuration->getName(), $this->entityManager->getRepository($class)->findOneById($id));
return true;
}
public function supports(ParamConverter $configuration)
{
return $configuration->getName() === 'food';
}
}
Добавление его вваши услуги:
services:
food_converter:
class: App\SupportClasses\FoodConverter
arguments: ['@doctrine.orm.entity_manager']
tags:
- {name: request.param_converter, priority: -2, converter: food_converter}
Используя это так:
class FoodController
{
/**
* @Route("/items/fruits/{id}", methods={"GET"}, name="fruits_show")
* @Route("/items/vegetables/{id}", methods={"GET"}, name="vegetables_show")
* @ParamConverter("food", converter = "food_converter" class="App:Food", options={"fruits_show" = "App:Fruit", "vegetables_show" = "App:Vegetable"})
*/
public function foodAction(Request $request, $food)
{
var_dump($food);
exit();
}
}