我有以下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;
}
/..
我无法完全理解这种行为,我想加载通过路由参数传递的任何Product
或ProductVariation
对象
在路由中使用实体的"标识符"时,不需要@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