2015-04-24 10 views
13

Potrzebuję dokonać transakcji płatniczej dla aplikacji i zobaczyłem JSMPaymentCoreBundle.Jak mogę przekazać obiekt Order do szczegółówAction i CompleteAction za pomocą JMS payementCoreBundle

Przeczytałem dokumentację z JSMPaymentCoreBundel, ale zastanawiam się, jak mogę przekazać obiekt do kontrolera detailsAction (Order $ order) i completeAction (Order $ order).

Na przykład, w sterowniku detailAction odpowiedź przekierowanie wygląda następująco:

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

Dla mnie, my don "t przechodzą żądany obiekt porządek w param do kontrolera completeAction poniżej ale tylko orderNumer:

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

myślę, że jeśli nie zdam przedmiotu zamówienia, będę się błąd. Więc co jest najlepszym sposobem, aby to zrobić i jak?

nowego w rozwoju i Symfony, naprawdę chcę zrozumieć, a nie po prostu zrobić kopię/wkleić.

Każda pomoc będzie doceniona.

+0

Ten facet ma więcej niż laska, że ​​jest on oferuje. +1, ponieważ bardziej interesujesz się problemem niż reputacją. –

Odpowiedz

3

Myślisz dostaniesz błąd, ale czy rzeczywiście pojawia się błąd?

Dokumentacja, którą przeczytałeś dla JSMPaymentCoreBundel ma absolutną rację. Jeśli wpiszesz parametr do akcji kontrolera, symbol zastępczy trasy zostanie przekonwertowany na odpowiedni obiekt, jeśli zostanie znaleziony. Zobacz link opublikowany przez Evgeniy.Dont nawet trzeba użyć ParamConverter

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

Kilka rzeczy dzieją się pod maską:

Konwerter próbuje uzyskać SensioBlogBundle: obiekt Post z atrybutów żądania (request atrybutów pochodzi z zastępczych tras - - tutaj id);

Jeśli nie zostanie znaleziony obiekt Post, wygenerowana zostanie odpowiedź 404;

Jeśli zostanie znaleziony obiekt Post, zdefiniowany zostanie nowy atrybut żądania postu (dostępny za pośrednictwem $ request-> attributes-> get ('post'));

Podobnie jak w przypadku innych atrybutów żądania, jest on automatycznie wprowadzany do kontrolera, gdy jest obecny w sygnaturze metody.

Jeśli używasz typów parametrów, jak w powyższym przykładzie, można nawet pominąć adnotacji @ParamConverter sumie:

+0

Tak, dodałem trochę eksplantacji, bo także było pomylone z powodu błędu –

+0

Ooooh Naprawdę nie wiem o tym! Potężny. Ale zawsze mam pytanie, ale być może musiałem zadać nowe pytanie w celu wyjaśnienia. W detailActions(), jeśli przetestowałem, muszę przekazać zlecenie Number i konwerter, czy istnieje obiekt (w db). W tym przypadku muszę zapisać zamówienie w DB przed przekierowaniem do detailsAction. Jeśli zawsze będę we właściwy sposób, dlaczego musimy utrzymać kolejność w stanie isValid? Wielkie dzięki dla was wszystkich za te odpowiedzi! –

4

Można użyć @ParamConverter adnotacji do CONVER się numer zamówienia podmiotowi

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: czytać swoje pytanie ponownie i trochę zdezorientowany. Czy masz problem (błąd), aby zdobyć $ order, czy po prostu nie wiesz, dlaczego przekazujesz OrderNumber, ale dostajesz Order Order?

Jeśli tak, to po prostu zignorować mój pierwszy przykład, że zrobić sama, jak pokazano na rysunku:

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

Oznacza to, że ParameterConverter zrobi magii dla Twojego przekonwertować przekazany numer zamówienia, aby podmiot zamówienia, które faktycznie jest „najlepsza praktyka "podejście zalecane przez Symfony doc: http://symfony.com/doc/2.3/best_practices/controllers.html#using-the-paramconverter

I nie trzeba dodać dodatkową adnotację o takim przypadku