Подтвердить что ты не робот

Как я могу передать объект Order в detailsAction и CompleteAction с помощью JMS payementCoreBundle

Мне нужно сделать транзакцию платежа для приложения, и я увидел JSMPaymentCoreBundle.

Я прочитал документацию JSMPaymentCoreBundel, но мне интересно, как я могу передать объект в контроллер detailsAction (Order $order) и completeAction (Order $order).

Например, в контроллере detailAction ответ на перенаправление выглядит следующим образом:

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

Для меня мы не передаем требуемый объект Order в param для полного контроллера Action ниже, а только orderNumer:

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

Я думаю, что если я не пройду объект Order, я получу ошибку. Так что лучший способ сделать это и как?

Новое в разработке и Symfony, я действительно хочу понять, а не просто сделать копию/вставку.

Любая помощь будет оценена.

4b9b3361

Ответ 1

Вы думаете, что получите ошибку, но действительно ли вы получили сообщение об ошибке?

Документация, которую вы читаете для JSMPaymentCoreBundel, абсолютно верна. Если вы набираете подсказку параметра в действии вашего контроллера, то заполнитель маршрута будет преобразован в соответствующий объект, если он найден. См. Ссылку, опубликованную Евгением. Вы не даже нужно использовать ParamConverter

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

Несколько вещей происходят под капотом:

Конвертор пытается получить объект SensioBlogBundle: Post из атрибутов запроса (атрибуты запроса поступают из заполнителей маршрутов - здесь id);

Если объект Post не найден, генерируется ответ 404;

Если объект Post найден, определяется новый атрибут post request (доступный через $request- > attributes- > get ('post'));

Как и для других атрибутов запроса, он автоматически вводится в контроллер, если присутствует в сигнатуре метода.

Если вы используете подсказки типа, как в приведенном выше примере, вы можете даже вообще аннотировать аннотацию @ParamConverter:

Ответ 2

Вы можете использовать аннотацию @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){
        ...
    }

Update: снова прочитайте свой вопрос и немного смутитесь. Итак, есть ли у вас проблема (ошибка), чтобы получить $order или вы просто смутили, почему вы передаете OrderNumber, но получаете объект Order?

Если это так, просто проигнорируйте мой первый пример, который делает то же самое, что показано:

/**
     * @Route("/{orderNumber}/details", name = "payment_details")
     * @Template
     */
    public function detailsAction(Order $order)

Это означает, что ParameterConverter сделает магию для конвертирования пройденного порядкового номера в заказ сущности, что на самом деле является "наилучшей практикой", рекомендованной компанией Symfony doc: http://symfony.com/doc/2.3/best_practices/controllers.html#using-the-paramconverter

И вам не нужно добавлять дополнительную аннотацию для такого случая