实体管理器不会保留



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

services:
AppBundleRepositorySecurityAwareRepository:
abstract:  true
calls:
- method: setTokenStorage
arguments:
- "@security.token_storage"

AppBundleRepositoryInvoiceRepository:
parent: AppBundleRepositorySecurityAwareRepository
factory: ["@doctrine", getRepository]
arguments:
- "AppBundle:Invoice"

然后在控制器中处理表单:

public function creditCardSaveAction(Request $request)
{
$repo = $this->get('AppBundleRepositoryInvoiceRepository');
/** @var AppBundleEntityInvoiceAddress $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 DoctrineORMEntityRepository
{
...    
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)

然而,这也不起作用。

此应用程序中只有一个默认实体管理器

表单创建:

控制器:

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

我最初创建了发票地址实体

creditcardToken:
type: string
length: 200
nullable: true

然后将其更改为

creditcard_token:
type: string
length: 200
nullable: true

我运行了 bin/console 原则:生成:实体 AppBundle,但没有更新 setter 和 getter。

尝试在表单中使用"bind">

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

或者就像你的代码一样

$form->bind($request);

就在这条线之前

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

最新更新