Tôi có một mẫu với 3 lớp: lớp Đầu tiên là các container cho các trò chơi:Cascade Validation không làm việc trên lớp thứ ba của một hình thức
class GameListType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('games', 'collection', array(
'required' => false,
'allow_add' => true,
'prototype' => true,
'by_reference' => false,
'type' => new GameBetType(),
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
parent::setDefaultOptions($resolver);
$resolver->setDefaults(array(
'cascade_validation' => true,
));
}
}
Thứ hai lớp là trò chơi chính nó, kể từ khi tôi làm không có ý định thay đổi cuộc chơi, nhưng đặt cược vào nó, nó chỉ bao gồm các hình thức cho đặt cược:
class GameBetType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('bet', new BetType());
}
public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) {
parent::setDefaultOptions($resolver);
$resolver->setDefaults(array(
'data_class' => 'Strego\TippBundle\Entity\Game',
'cascade_validation' => true,
));
}
}
Và lớp thứ ba là hình thức cho đặt cược:
class BetType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('scoreT1' , 'text')
->add('scoreT2' , 'text');
;
}
public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) {
parent::setDefaultOptions($resolver);
$resolver->setDefaults(array(
'data_class' => 'Strego\TippBundle\Entity\Bet',
));
}
}
.210
Vấn đề là, rằng nếu có trở ngại xác nhận vào mức độ thứ ba, hình thức gốc luôn là hợp lệ, nhưng nếu tôi đặc biệt xác nhận các tổ chức cá cược, tôi nhận được danh sách vi phạm đúng trong điều khiển của tôi:
// Form processing
$form = $this->createForm(new GameListType(), $entity);
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
$form->bind($request);
$entity = $form->getData();
if ($form->isValid()) {
foreach ($entity->getGames() as $game) {
if($game->hasBet()){
$bet = $game->getBet();
$bet->setUser($user);
$validator = $this->container->get('validator');
$errors = $validator->validate($bet);
var_dump($errors) //<-- i see there are errors
if(count($errors) == 0){
print($bet. ' gets persisted<br>');
$em->persist($bet);
}
}
}
$em->flush();
}
}
Một vấn đề khác là ngay cả khi tôi không gọi $em->persist($bet)
các thực thể vẫn tiếp tục tồn tại. Tôi không thấy kết quả được mô tả trong dòng
print($bet.'gets persisted<br>');
nhưng đầu vào biểu mẫu vẫn tiếp tục tồn tại trong cơ sở dữ liệu.
Vì vậy, hai câu hỏi của tôi:
Làm thế nào để tôi nhận được lỗi nếu xác nhận thất bại trên đặt cược không hình thức (tôi không muốn toàn bộ hình thức là không hợp lệ, vì không chỉ có thể 1 trong số 3 cược không hợp lệ).
Tại sao đặt cược vẫn tiếp tục ngay cả khi tôi không gọi
$em-persist($bet)
, đây có phải là một số phép thuật xảy ra với sự ràng buộc không?
lòng cũng cung cấp các AbstractType lớp – Vineet1982
của nó symfony2 mặc định AbstractType: https://github.com/symfony/symfony/blob/master/src /Symfony/Component/Form/AbstractType.php – m0c