我有以下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
个对象
答案 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