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