如何使用 JMS payementCoreBundle 将 Order 对象传递给 detailsAction 和 CompleteAction

How can I pass Order object to detailsAction and CompleteAction using JMS payementCoreBundle

我需要为应用程序进行支付交易,我看到了 JSMPaymentCoreBundle。

我阅读了 JSMPaymentCoreBundel 的文档,但我想知道如何将对象传递给控制器​​ detailsAction(Order $order) 和 completeAction(Order $order)。

例如,在 detailAction 控制器中,重定向响应如下所示:

return new RedirectResponse($this->router->generate('payment_complete', array('orderNumber' => $order->getOrderNumber(),)));

对我来说,我们不会将参数中所需的 Order 对象传递给下面的 completeAction 控制器,而只会传递 orderNumer:

/**
* @Route("/{orderNumber}/complete", name = "payment_complete")
*/
public function completeAction(Order $order){
    ...
}

我认为如果我不传递 Order 对象,就会出错。那么最好的方法是什么?如何做?

开发和Symfony的新手,我真的很想了解而不是简单地制作一个copy/paste。

如有任何帮助,我们将不胜感激。

您可以使用@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 转换为实体订单,这实际上是 "best practice" Symfony 文档推荐的方法:http://symfony.com/doc/2.3/best_practices/controllers.html#using-the-paramconverter

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

你认为你会报错,但你真的报错了吗?

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

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

Several things happen under the hood:

The converter tries to get a SensioBlogBundle:Post object from the request attributes (request attributes comes from route placeholders -- here id);

If no Post object is found, a 404 Response is generated;

If a Post object is found, a new post request attribute is defined (accessible via $request->attributes->get('post'));

As for other request attributes, it is automatically injected in the controller when present in the method signature.

If you use type hinting as in the example above, you can even omit the @ParamConverter annotation altogether: