контроллер
public function indexAction(Request $request) { $user = $this->container->get('security.context')->getToken()->getUser(); $owner = $user->getId(); $first = new First(); $first->setOwner($owner); $second = new Second(); $second->setOwner($owner); $second->setFirst($first); $form = $this->createForm(new SecondType(), $second); if ($request->getMethod() == 'POST') { $form->bindRequest($request); if ($form->isValid()) { $em = $this->get('doctrine')->getEntityManager(); $em->persist($first); $em->persist($second); $em->flush(); } } return $this->render('MySampleBundle:Home:index.html.twig', array( 'form' => $form->createView(), )); }
ORM Yaml
My\SampleBundle\Entity\First: type: entity table: first id: id: type: integer generator: { strategy: AUTO } fields: title: type: string date_created: type: datetime date_edited: type: datetime owner: type: integer lifecycleCallbacks: prePersist: [ prePersist ] preUpdate: [ preUpdate ] oneToMany: reviews: targetEntity: Second mappedBy: review My\SampleBundle\Entity\Second: type: entity table: second id: id: type: integer generator: { strategy: AUTO } fields: review: type: string date_created: type: datetime date_edited: type: datetime owner: type: integer lifecycleCallbacks: prePersist: [ prePersist ] preUpdate: [ preUpdate ] manyToOne: first: targetEntity: First inversedBy: reviews joinColumn: name: first_id referencedColumnName: id
Во-My\SampleBundle\Entity\First: type: entity table: first id: id: type: integer generator: { strategy: AUTO } fields: title: type: string date_created: type: datetime date_edited: type: datetime owner: type: integer lifecycleCallbacks: prePersist: [ prePersist ] preUpdate: [ preUpdate ] oneToMany: reviews: targetEntity: Second mappedBy: review My\SampleBundle\Entity\Second: type: entity table: second id: id: type: integer generator: { strategy: AUTO } fields: review: type: string date_created: type: datetime date_edited: type: datetime owner: type: integer lifecycleCallbacks: prePersist: [ prePersist ] preUpdate: [ preUpdate ] manyToOne: first: targetEntity: First inversedBy: reviews joinColumn: name: first_id referencedColumnName: id
Форма / тип
class FirstType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('title', 'text'); } public function getDefaultOptions(array $options) { return array( 'data_class' => 'My\SampleBundle\Entity\First', ); } public function getName() { return 'first'; } } class SecondType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('first', new FirstType()); $builder->add('review', 'textarea'); } public function getName() { return 'second'; } }
Validation.yml
My\SampleBundle\Entity\First: properties: title: - NotBlank: ~ - MinLength: 2 My\SampleBundle\Entity\Second: properties: review: - NotBlank: ~ - MinLength: 14
Во-My\SampleBundle\Entity\First: properties: title: - NotBlank: ~ - MinLength: 2 My\SampleBundle\Entity\Second: properties: review: - NotBlank: ~ - MinLength: 14
Созданная форма работает нормально. Однако только проверка не работает нормально.
Если он выполняет индивидуально, проверка будет работать нормально.
$form = $this->createForm(new FirstType(), $first);
Однако, если он находится в состоянии Entity Relationships / Associations, первая проверка не будет работать. Свойство Title First в одном символе будет зарегистрировано.
Как я могу это достичь?
Symfony 2.1+ автоматически не проверяет все внедренные объекты. Вам нужно поставить ограничение Valid
на first
поле, чтобы оно также проверялось:
My\SampleBundle\Entity\Second: properties: first: - Valid: ~