13

我需要为应用程序进行支付交易,我看到了 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 的新手,我真的很想了解而不是简单地复制/粘贴。

任何帮助将不胜感激。

4

2 回答 2

4

您可以使用 @ParamConverter 注释将 orderNumber 转换为其实体

http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html

use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
...
    /**
    * @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 文档推荐的“最佳实践”方法:http: //symfony.com/doc/2.3/best_practices/controllers.html#使用参数转换器

而且您不需要为这种情况添加额外的注释

于 2015-05-07T14:56:20.283 回答
3

你认为你会得到错误,但你真的得到了错误吗?

您阅读的文档JSMPaymentCoreBundel绝对正确。如果您在控制器操作中键入提示参数,则路由占位符将转换为相应的对象(如果找到)。请参阅 Evgeniy 发布的链接。你甚至不需要使用ParamConverter

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\BlogBundle\Entity\Post;
/**
 * @Route("/blog/{id}")
 */
public function showAction(Post $post)
{
    //your code here
}

引擎盖下发生了几件事:

转换器尝试从请求属性中获取 SensioBlogBu​​ndle:Post 对象(请求属性来自路由占位符——此处为 id);

如果没有找到 Post 对象,则生成 404 Response;

如果找到一个 Post 对象,则定义一个新的 post 请求属性(可通过 $request->attributes->get('post') 访问);

至于其他请求属性,当它出现在方法签名中时,它会自动注入到控制器中。

如果您使用上面示例中的类型提示,您甚至可以完全省略 @ParamConverter 注释:

于 2015-05-07T15:24:05.653 回答