【问题标题】:Symfony 2.8 loading a wrong entity instance to controllerSymfony 2.8 将错误的实体实例加载到控制器
【发布时间】:2017-12-21 09:02:16
【问题描述】:

我有以下 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)正确地给我相应的Productobject。
  • {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){
     /...
    

Entities的代码sn-ps如下

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;
}
 /..

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

【问题讨论】:

    标签: routing symfony-2.8


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2013-12-18
      相关资源
      最近更新 更多