Как я могу передать объект 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, я действительно хочу понять, а не просто сделать копию/вставку.
Любая помощь будет оценена.
Ответы
Ответ 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
И вам не нужно добавлять дополнительную аннотацию для такого случая