2017-07-19 64 views
0

我從服務檢索實體庫這樣的:EntityManager的不持續

services: 
    AppBundle\Repository\SecurityAwareRepository: 
     abstract: true 
     calls: 
      - method: setTokenStorage 
       arguments: 
       - "@security.token_storage" 


    AppBundle\Repository\InvoiceRepository: 
     parent: AppBundle\Repository\SecurityAwareRepository 
     factory: ["@doctrine", getRepository] 
     arguments: 
      - "AppBundle:Invoice" 

,然後我在控制器處理的形式:

public function creditCardSaveAction(Request $request) 
{ 
    $repo = $this->get('AppBundle\Repository\InvoiceRepository'); 
    /** @var \AppBundle\Entity\InvoiceAddress $latestInvoice */ 
    $latestInvoice = $repo->getLatestInvoice(); 
    if ($latestInvoice){ 
     $form = $this->createForm(CreditCardUpdate::class); 
     $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 

      $invoiceAddress = $latestInvoice->getInvoiceAddress(); 
      $invoiceAddress->setCreditcardToken($form->getData()['stripeToken']); 
      $invoiceAddress->setPaymentProvider($this->get('payment_provider_repository')->find(1));//hard coded to Stripe 
      $repo->persist($invoiceAddress); 
      $repo->flush($invoiceAddress); 
      return $this->redirectToRoute('site_index'); 
     }else{ 
      return $this->redirectToRoute('creditcard_update'); 
     } 

    } 
} 

然而,這並不保存'stripeToken'字段,雖然我可以通過setCreditcardToken看到它到達實體

堅持和刷新功能實現如下:

class SecurityAwareRepository extends \Doctrine\ORM\EntityRepository 
{ 
...  
    public function persist($entity) 
    { 
     $this->_em->persist($entity); 
    } 


    public function flush($entity) 
    { 
     $this->_em->flush($entity); 
    } 

實現像在此之前,我只是試圖

$em = $this->getDoctrine()->getManager(); 
$invoiceAddress->setCreditcardToken(...); 
$em->persist($invoiceAddress); 
$em->flush($invoiceAddress) 

然而這也不能工作。

只有一個默認的EntityManager在此應用

表單創建:

控制器:

$form = $this->createForm(CreditCardUpdate::class); 
     return $this->render('@AppBundle/invoice_address/credit_card_update.html.twig', [ 
      'form' => $form->createView() 
     ]); 

嫩枝:

<form action="{{ path('creditcard_save') }}" method="post" id="payment-form" class="text-center"> 
      {{ form_widget(form.stripeToken) }} 
      {{ form_widget(form._token) }} 
      <div class="form-row credit_card_background text-center"> 
       <div id="card-element"> 

       </div> 

       <div id="card-errors" role="alert"></div> 
      </div> 

      <button class="btn btn-default ">Submit Payment</button> 
     </form> 



class CreditCardUpdate extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('stripeToken', HiddenType::class); 
    } 
} 
+0

前,應驗證碼:'$形式 - > getData()['stripeToken']'而不是:'$ form-> getData('stripeToken')'? –

+0

這一個也適用,但不保存$ form-> getData('credit_card_update')['stripeToken'](credit_card_update是我的表單前綴 – jdog

+0

)你是如何創建表單的?特別是'stripToken'部分? –

回答

0

我最初創建InvoiceAddress實體

creditcardToken: 
type: string 
length: 200 
nullable: true 

然後將其改爲

creditcard_token: 
type: string 
length: 200 
nullable: true 

我跑斌/控制檯學說:生成:實體的appbundle,但沒有更新的setter和getter。

+0

很確定這不是你的答案?有關信息,您可以使用編輯按鈕更新您的問題。確保你正在編輯正確的映射文件。我知道這聽起來很愚蠢,但有很多次我在編輯錯誤的文件,並想知道爲什麼我的更改沒有生效。 – Cerad

+0

這是解決方案,抱歉,我沒有想到當我寫這個問題 – jdog

-1

使用 「綁定」 的形式

$form->bind($this->getRequest()); 

或者爲你的代碼嘗試是

$form->bind($request); 

只是這一行

if ($form->isSubmitted() && $form->isValid()) { 
+0

已經有$ form-> handleRequest($ request);定義。 – Carca