【问题标题】:EntityManager does not persistEntityManager 不持久
【发布时间】:2017-07-19 03:53:27
【问题描述】:

我正在从这样的服务中检索实体存储库:

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"

然后在 Controller 中处理表单:

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 到达实体

persist 和 flush 函数是这样实现的:

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 );
    }
}

【问题讨论】:

  • 是否应该将此代码:$form-&gt;getData()['stripeToken'] 改为:$form-&gt;getData('stripeToken')?
  • 这个也可以,但不保存 $form->getData('credit_card_update')['stripeToken'] (credit_card_update 是我的表单前缀
  • 您是如何创建表单的?特别是stripToken 部分?您可以编辑您的帖子并显示该代码吗?只是缩写代码而已。
  • @AlvinBunk 已添加
  • 在刷新之前添加一个转储($invoiceAddress),以确认您到达那里的预期值。

标签: symfony doctrine


【解决方案1】:

我最初用

创建了 InvoiceAddress 实体
creditcardToken:
type: string
length: 200
nullable: true

然后改成

creditcard_token:
type: string
length: 200
nullable: true

我运行了 bin/console dictionary:generate:entities AppBundle,但没有更新 setter 和 getter。

【讨论】:

  • 很确定这不是你的答案?有关信息,您可以使用编辑按钮更新您的问题。并确保您正在编辑正确的映射文件。我知道这听起来很傻,但有很多次我编辑了错误的文件并想知道为什么我的更改没有生效。
  • 这就是解决方案,抱歉我写问题的时候没有想到
【解决方案2】:

尝试使用“绑定”到表单

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

或者你的代码是

$form->bind($request);

就在这一行之前

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

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 2011-03-24
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2018-01-14
    • 1970-01-01
    相关资源
    最近更新 更多