Symfony2-포함 된 양식 유형에 대한 유효성 검사가 작동하지 않음
두 엔터티 (사용자 및 프로필)를 결합하는 양식이 있습니다.
유효성 검사는 사용자 엔터티에서 제공되는 양식의 첫 번째 부분에서 작동하는 것으로 보이며 양식의 기초입니다.
ProfileType은 UserType 내에 포함됩니다. 양식이 올바르게 렌더링되고 올바른 정보를 표시하므로 프로필 엔터티에 제대로 연결된 것 같습니다. ProfileType에서 깨진 유효성 검사일뿐입니다.
한 부분이 유효성을 검사하고 다른 부분이 유효성을 검사하지 않는 이유에 대한 아이디어가 있습니까?
아래 코드 :
Validation.yml
DEMO\DemoBundle\Entity\User\Profile:
properties:
address1:
- NotBlank: { groups: [profile] }
name:
- NotBlank: { groups: [profile] }
companyName:
- NotBlank: { groups: [profile] }
DEMO\DemoBundle\Entity\User\User:
properties:
username:
- NotBlank:
groups: profile
message: Username cannot be left blank.
email:
- NotBlank:
groups: profile
message: Email cannot be left blank
- Email:
groups: profile
message: The email "{{ value }}" is not a valid email.
checkMX: true
password:
- MaxLength: { limit: 20, message: "Your password must not exceed {{ limit }} characters." }
- MinLength: { limit: 4, message: "Your password must have at least {{ limit }} characters." }
- NotBlank: ~
UserType.php
namespace DEMO\DemoBundle\Form\Type\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackValidator;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormError;
use DEMO\DemoBundle\Form\Type\User\ProfileType;
class UserType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('username');
$builder->add('email');
$builder->add('profile', new ProfileType());
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'DEMO\DemoBundle\Entity\User\User',
'validation_groups' => array('profile')
);
}
public function getName()
{
return 'user';
}
}
ProfileType.php
namespace DEMO\DemoBundle\Form\Type\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackValidator;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormError;
class ProfileType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('name');
$builder->add('companyName', null, array('label' => 'Company Name'));
$builder->add('address1', null, array('label' => 'Address 1'));
$builder->add('address2', null, array('label' => 'Address 2'));
$builder->add('city');
$builder->add('county');
$builder->add('postcode');
$builder->add('telephone');
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'DEMO\DemoBundle\Entity\User\Profile',
);
}
public function getName()
{
return 'profile';
}
}
제어 장치
$user = $this->get('security.context')->getToken()->getUser();
$form = $this->createForm(new UserType(), $user);
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
// Get $_POST data and submit to DB
$em = $this->getDoctrine()->getEntityManager();
$em->persist($user);
$em->flush();
// Set "success" flash notification
$this->get('session')->setFlash('success', 'Profile saved.');
}
}
return $this->render('DEMODemoBundle:User\Dashboard:profile.html.twig', array('form' => $form->createView()));
나는 나이 검색 시간에이 추가 된 것을 발견 'cascade_validation' => true
받는 setDefaults()
(스레드에서 이미 언급 한 바와 같이)를 고정 내 부모 타입의 클래스의 배열입니다. 이로 인해 엔터티 제약 조건 유효성 검사가 양식에 표시된 자식 유형에서 트리거됩니다. 예 :
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
...
'cascade_validation' => true,
));
}
컬렉션의 경우 양식의 컬렉션 필드에 대한 배열 에도 추가 'cascade_validation' => true
해야합니다 $options
. 예 :
$builder->add('children', 'collection', array(
'type' => new ChildType(),
'cascade_validation' => true,
));
이렇게하면 컬렉션에 사용 된 자식 엔터티에서 수행되는 UniqueEntity 유효성 검사가 수행됩니다.
Symfony 3.0 이상을 사용하는 사용자를위한 참고 사항 : cascade_validation
옵션 이 제거되었습니다 . 대신 포함 된 양식에 다음을 사용하십시오.
$builder->add('embedded_data', CustomFormType::class, array(
'constraints' => array(new Valid()),
));
약간 주제에서 벗어난 답변 (Symfony 3 vs. 2)으로이 오래된 스레드에 추가하여 죄송합니다. 그러나 여기서이 정보를 찾으면 오늘 몇 시간을 절약 할 수있었습니다.
양식 유형 문서 에 따르면 옵션 Valid
대신 제약 조건 을 사용할 수도 있습니다 cascade_validation
.
$builder->add('children', 'collection', array(
'type' => new ChildType(),
'constraints' => array(new Valid()),
));
소유자 엔티티의 예 :
/**
* @var Collection
*
* @ORM\OneToMany(targetEntity="Child", ...)
* @Assert\Valid()
*/
private $children
YML 또는 주석을 사용하고 있습니까?
cascade_validation
부모 양식 클래스에 옵션을 적용하려고 했지만 유효성 검사가 여전히 발생하지 않았습니다. 약간의 문서를 읽은 후 under 가 true 로 설정되어 app/config/config.yml
있음을 발견했습니다 . 이것이 사실이라면 유효성 검사 서비스는 어떤 사람도 validation.yml 파일을 읽지 않습니다. 그래서 방금 false로 변경 했으며 이제 양식이 제대로 확인되고 있습니다.enable_annotations
framework->validation
Symfony 2.3에 속함
포함 된 양식 및 유효성 검사 그룹으로 작업하는 것은 매우 고통 스러울 수 있습니다. @Assert \ Valid () 주석은 저에게 적합하지 않습니다 (그룹 없이는 괜찮습니다). DefaultOptions가 키인 경우 'cascade_validation'=> true를 삽입합니다. -> add ()에서 이것을 반복 할 필요가 없습니다. 주의 : HTML 5 유효성 검사는 유효성 검사 그룹과 함께 작동하지 않습니다.
예:
2 개의 주소 모음. 둘 다 1 : 1 단방향. 각각 다른 (!) 유효성 검사 그룹이 있습니다.
class TestCollection{
//(...)
/**
* @var string
* @Assert\NotBlank(groups={"parentValGroup"})
* @ORM\Column(name="name", type="string", length=255, nullable=true)
*/
protected $name;
/**
* @var \Demo\Bundle\Entity\TestAddress
* @Assert\Type(type="Demo\Bundle\Entity\TestAddress")
* @ORM\OneToOne(targetEntity="TestAddress",cascade={"persist","remove"},orphanRemoval=true)
* @ORM\JoinColumn(name="billing_address__id", referencedColumnName="id")
*/
protected $billingAddress;
/**
* @var \Demo\Bundle\Entity\TestAddress
* @Assert\Type(type="Demo\Bundle\Entity\TestAddress")
* @ORM\OneToOne(targetEntity="TestAddress",cascade={"persist","remove"}, orphanRemoval=true)
* @ORM\JoinColumn(name="shipping_address__id", referencedColumnName="id")
*/
protected $shippingAddress;
//(...)
}
주소 엔티티
class TestAddress {
/**
* @var string
* @Assert\NotBlank(groups={"firstname"})
* @ORM\Column(name="firstname", type="string", length=255, nullable=true)
*/
private $firstname;
/**
* @var string
* @Assert\NotBlank(groups={"lastname"})
* @ORM\Column(name="lastname", type="string", length=255, nullable=true)
*/
private $lastname;
/**
* @var string
* @Assert\Email(groups={"firstname","lastname"})
* @ORM\Column(name="email", type="string", length=255, nullable=true)
*/
private $email;
주소 유형-유효성 검사 그룹 변경 기능
class TestAddressType extends AbstractType {
protected $validation_group=['lastname'];//switch group
public function __construct($validation_group=null) {
if($validation_group!=null) $this->validation_group=$validation_group;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
//disable html5 validation: it suchs with groups
$builder
->add('firstname',null,array('required'=>false))
->add('lastname',null,array('required'=>false))
->add('email',null,array('required'=>false))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Demo\Bundle\Entity\TestAddress',
'validation_groups' => $this->validation_group,
));
}
(...)
마지막으로 CollectionType
class TestCollectionType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{ $builder
->add('name')
->add('billingAddress', new TestAddressType(['lastname','firstname']))
->add('shippingAddress', new TestAddressType(['firstname']))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Demo\Bundle\Entity\TestCollection',
'validation_groups' => array('parentValGroup'),
'cascade_validation' => true
));
}
//(...)
도움이 되었기를 바랍니다 ..
당신은 또한 추가 validation_groups
해야 ProfiletType
합니다. 유효성 검사는 data_class
존재 여부에 따라 각 양식 유형에서 개별적으로 수행됩니다 .
나는 똑같은 것을 찾고 있었고 여기에 내가 찾은 것이 있습니다.
http://symfony.com/doc/master/book/forms.html#forms-embedding-single-object
You need to tell the main entity to validate it's sub entities like so:
/**
* @Assert\Type(type="AppBundle\Entity\Category")
* @Assert\Valid()
*/
private $subentity;
I've tested this on symfony 2.8 and it works.
From my controller:
$form = $this->get('form.factory')
->createNamedBuilder('form_data', 'form', $item, array('cascade_validation' => true))
->add('data', new ItemDataType())
->add('assets', new ItemAssetsType($this->locale))
->add('contact', new ItemContactType())
->add('save', 'submit',
array(
'label' => 'Save',
'attr' => array('class' => 'btn')
)
)
->getForm();
Fourth parametr in ::createNamedBuilder - array('cascade_validation' => true))
참고URL : https://stackoverflow.com/questions/10138505/symfony2-validation-not-working-for-embedded-form-type
'developer tip' 카테고리의 다른 글
PHP를 사용하여 JSON 게시물 보내기 (0) | 2020.10.25 |
---|---|
쉼표 천 단위 구분 기호가있는 문자열을 숫자로 구문 분석하려면 어떻게해야합니까? (0) | 2020.10.25 |
포드의 컨테이너 내부에서 포드의 자체 IP 주소를 아는 방법은 무엇입니까? (0) | 2020.10.25 |
문자열의 마지막 4자를 얻는 방법? (0) | 2020.10.25 |
Nullable 형식 : C #에서 null 또는 0을 확인하는 가장 좋은 방법 (0) | 2020.10.25 |