管理者がAjax POSTリクエストを使用してユーザのアカウントに支払いをクレジットすることができるSymfony2アプリケーションがあります。 POSTリクエストはSymfonyコントローラによって処理されるJSONを送信します。コントローラーは「支払い」エンティティーを作成し、それを検証して保持する必要があります。 Symfonyのフォームシステムの組み込み検証を利用したいと考えています。一例として、Symfony2:AjaxとFormsを使用してすべてのエンティティをロードせずに関連するエンティティを作成する
、クレジット100PとID 20を持つユーザー、掲載JSON symfonyの終わりに
{"user":"20","amount":"100","description":"test payment","paymentType":"credit"}
...のようになりますされ、我々はPaymentTypeフォームを持っています。
class PaymentType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('user', 'entity', [
'class' => 'OurAppBundle\Entity\User',
'choice_label' => 'email',
'multiple' => false,
'expanded' => true,
]);
$builder->add('paymentType', 'choice', [
'choices' => [ 1 => 'credit', 2 => 'debit'],
'choices_as_values' => true,
]);
$builder->add('amount', 'number');
$builder->add('description', 'textarea');
}
支払いエンティティはユーザーエンティティに関連しており、検証が含まれています。
class Payment
{
const TYPE_CREDIT = 'credit';
const TYPE_DEBIT = 'debit';
use TimestampableTrait;
/**
* The ID of the payment
*
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* the User object
*
* @var User
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="payments")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE", nullable=false)
*/
protected $user;
/**
* payment type
*
* either 'credit' - a credit to the user's account
* or 'debit' - money taken out their account
*
* @var string
*
* @ORM\Column(name="payment_type", type="string", length=7, nullable=false)
*
* @Assert\Choice(choices= {"credit", "debit"}, message="Choose a valid payment type")
*/
protected $paymentType;
/**
* amount
*
* amount of payment, in pence
*
* @var int
*
* @ORM\Column(name="amount", type="integer", nullable=false)
*
* @Assert\Range(
* min = 1,
* max = 2000,
* minMessage = "Payments must be positive",
* maxMessage = "You cannot credit/debit more than £20"
*)
*/
protected $amount;
/**
* a string describing the transaction
*
* @var string
*
* @ORM\Column(name="description", type="string", length=255, nullable=false)
*
* @Assert\NotBlank(message="Please enter a description")
*/
protected $description;
....
次の行に沿ってコントローラにコードがあります。
public function creditUserAction(Request $request)
{
$body = $request->getContent();
$formData = json_decode($body, true);
$payment = new Payment();
$form = $this->createForm(new PaymentType(), $payment);
$form->submit($data);
if ($form->isValid()) {
// persist and flush .....
} ....
問題がPaymentType形態がCreateFormのによりロードされるとき、教義は、データベースからすべてのユーザーをロードし、ユーザの数万があるしようとすることです。
私の質問は、関連するエンティティに何千ものインスタンスがあるSymfony Formsを使用する別のエンティティに関連する、Ajax POSTリクエストを使用してエンティティを作成するより良い方法があるかどうかです。
が合意されたフォームを作成せずに、あなたのエンティティを検証することができます。私はSymfony Formを使ってエンティティの各プロパティを手作業で設定する必要を省くことを望んでいましたが、すべてのプロパティを手動で設定することは厄介な作業ではありません。あなたの助けてくれてありがとう、私はあなたの提案された方法を使用します。 –