2017-07-19 63 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