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对象将通过第一个参数 (Product $product) 正确提供给我。
  • 但是{variationId}参数未正确加载。它总是加载一个特定的ProductVariation对象,而不管传递给{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
*
* @ORMColumn(name="product_id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $productId;
/../
public function getProductId(){
return $this->productId;
}
/..
class ProductVariation{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/../
public function getId(){
return $this->id;
}
/..

我无法完全理解这种行为,我想加载通过路由参数传递的任何ProductProductVariation对象

在路由中使用实体的"标识符"时,不需要@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

最新更新