我需要为应用程序进行支付交易,我看到了JSMPaymentCoreBundle。
我阅读了JSMPaymentCoreBundel的文档,但我想知道如何将对象传递给控制器detailsAction(Order$Order)和completeAction(Order$Order)。
例如,在detailAction控制器中,重定向响应如下所示:
return new RedirectResponse($this->router->generate('payment_complete', array('orderNumber' => $order->getOrderNumber(),)));
对我来说,我们不将param中所需的Order对象传递给下面的completeAction控制器,而只传递orderNumer:
/**
* @Route("/{orderNumber}/complete", name = "payment_complete")
*/
public function completeAction(Order $order){
...
}
我认为,如果我不传递Order对象,我会出错。那么,最好的方法是什么以及如何做到这一点呢?
新开发和Symfony,我真的很想了解,而不是简单地复制/粘贴。
任何帮助都将不胜感激。
您可以使用@ParamConverter注释将订单号转换为其实体
http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
use SensioBundleFrameworkExtraBundleConfigurationParamConverter;
...
/**
* @Route("/{orderNumber}/complete", name = "payment_complete")
* @ParamConverter("order", options={"mapping": {"orderNumber": "orderNumber"}})
*/
public function completeAction(Order $order){
...
}
更新:再次阅读您的问题,有点困惑。那么,您是否在获取$order时遇到了问题(错误),或者您只是混淆了为什么传递OrderNumber,但却获取order实体?
如果是这样的话,就忽略我的第一个例子:
/**
* @Route("/{orderNumber}/details", name = "payment_details")
* @Template
*/
public function detailsAction(Order $order)
这意味着ParameterConverter将神奇地将传递的orderNumber转换为实体Order,这实际上是Symfony doc推荐的"最佳实践"方法:http://symfony.com/doc/2.3/best_practices/controllers.html#using-参数转换器
并且您不需要为这种情况下的添加额外的注释
您认为会出现错误,但实际发生错误了吗?
您为JSMPaymentCoreBundel
阅读的文档是绝对正确的。如果您在控制器操作中键入hint参数,则如果找到,路由占位符将转换为相应的对象。查看叶甫根尼发布的链接。你没有甚至需要使用ParamConverter
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SensioBundleBlogBundleEntityPost;
/**
* @Route("/blog/{id}")
*/
public function showAction(Post $post)
{
//your code here
}
幕后发生了几件事:
转换器试图从请求属性中获取SensioBlogBundle:Post对象(请求属性来自路由占位符——这里是id);
如果没有找到Post对象,则生成404响应;
如果找到Post对象,则定义一个新的Post-request属性(可通过$request->attributes->get('Post')访问);
至于其他请求属性,当存在于方法签名中时,它会自动注入控制器中。
如果你像上面的例子一样使用类型提示,你甚至可以完全省略@ParamConverter注释: