Symfony 2.8将错误的实体实例加载到控制器

时间:2017-12-21 09:02:17

标签: routing symfony-2.8

我有以下symfony 2.8控制器

/**
 * Finds and displays a productVariation entity.
 *
 * @Route("/{productId}/variation/{variationId}", name="productvariation_show")
 * @ParamConverter("variation", class="AppBundle:ProductVariation", options={"id" = "variationId"})
 * @ParamConverter("product", class="AppBundle:Product", options={"productId" = "productId"})
 * @Method("GET")
 */
public function showVariationAction(Product $product,ProductVariation $productVariation)
{
    $deleteForm = $this->createVariationDeleteForm($product,$productVariation);

    dump($product);
    dump($productVariation);
  /.../
}

问题是ProductVariation的自动注入对象实例是错误的。

更多细节

    路径中的
  • {productId}参数工作正常,这意味着如果我使用1作为{productId},则通过第一个参数({{}}正确地为我提供了相应的Product对象。 {1}})。
  • Product $product参数未正确加载。它总是加载一个特定的{variationId}对象,无论传递给ProductVariation的是什么(Take {variationId}../1/variation/1../1/variation/2都加载../1/variation/3具有ProductVariation)的对象。
  • 刚发现自动加载的id-2对象取决于传递给ProductVariation的内容。似乎自动注入的{productId}对象始终是给定的ProductVariation值最小的对象 id(产品与产品差异之间存在一对多关系)
  • 已尝试使用相同问题的以下代码

    Product

实体的代码片段如下

/**
 * Finds and displays a productVariation entity.
 * @Route("/{productId}/variation/{Id}", name="productvariation_show")
 * @Method("GET")
 */
public function showVariationAction(Product $product,ProductVariation $productVariation){
 /...

我无法完全理解这种行为,我想加载通过路由参数传递的任何class Product{ /** * @var int * * @ORM\Column(name="product_id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $productId; /../ public function getProductId(){ return $this->productId; } /.. class ProductVariation{ /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /../ public function getId(){ return $this->id; } /.. Product个对象

1 个答案:

答案 0 :(得分:0)

当在路径中使用实体的“标识符”时,您不需要@ParamConverter注释,因为通过其id获取实体是转换器的默认行为。

所以行动可以如下:

/**
 * Create variation delete form with product and the variation. 
 * (or so the intent seems to be looking at the 'createVariationDeleteForm' being called)
 *
 * @Route("/{product}/variation/{productVariation}", name="product_variation_show")
 * @Method("GET")
 * 
 * @param Product $product
 * @param ProductVariation $productVariation
 */
public function showVariationAction(Product $product, ProductVariation $productVariation)
{
    $deleteForm = $this->createVariationDeleteForm($product,$productVariation);

    dump($product);
    dump($productVariation);
}

参考:https://symfony.com/doc/current/best_practices/controllers.html#using-the-paramconverter