2012-08-26 5 views
12

Tengo un formulario con 3 capas: primera capa es el contenedor de los juegos:Cascade La validación no trabajando en tercera capa de una forma

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

segunda capa es el juego en sí, ya que no hago tiene la intención de cambiar el juego, pero la apuesta en ella, sólo incluye la forma de la apuesta:

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

Y la tercera capa es la forma de la apuesta:

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', 
     )); 
    } 

} 

La cuestión es que si hay restricciones de validación en el tercer nivel, la forma de la raíz es siempre válida, pero si lo específicamente validar la entidad apuesta, tengo la lista de violación correcta en mi controlador:

// 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(); 
    } 
} 

Otro problema es que incluso si no llamo al $em->persist($bet), las entidades se conservan. No veo la salida se describe en la línea

print($bet.'gets persisted<br>'); 

pero la entrada de formulario es aún persistieron a la base de datos.

Así que mis dos preguntas:

  1. ¿Cómo consigo los errores si falla la validación de la apuesta falla en la forma (no quiero que toda la forma de ser no válida, ya que sólo se podía 1 de cada 3 apuestas no son válidas).

  2. ¿Por qué la apuesta persiste incluso si no llamo al $em-persist($bet), esto es algo mágico que ocurre con el enlace?

+0

amablemente que también proporcionan la clase AbstractType – Vineet1982

+0

su defecto el Symfony2 AbstractType: https://github.com/symfony/symfony/blob/master/src /Symfony/Component/Form/AbstractType.php – m0c

Respuesta

3

para responder a su segunda pregunta, es posible que haya declarado bidireccional OneToMany relación entre User y Bet entidad y establecer cascade={"persist"} en User lado de la relación. Entonces, el administrador de entidades marca automáticamente los objetos de entidad Bet para inserción/actualización en la siguiente operación flush. También mueva la línea $em->flush(); fuera del lazo. Como el método flush emite consultas db, se conecta a db cada vez que el código ingresa al bucle. Mientras que si $em->flush(); está fuera del ciclo, la entidad consultará una vez con todos los sql modificados envueltos en una sola transacción.

+0

Tengo una relación biderectional, pero no cascade = {persist] en ninguno de los lados. El color está fuera del ciclo, tal vez lo copié incorrectamente. – m0c

0

Estoy bastante seguro de que debe persistir la entidad game y no la de bet.

Para la verificación de validación, si hay alguna configuración del grupo de validación, podría ser la razón por la que no está validando correctamente.

+0

En este formulario, solo se envían las apuestas, los juegos existieron antes y no se cambian.Y no hay grupos de validación – m0c

1

Sólo olvida de añadir cascade_validation a juegos collection tipo

$builder->add('games', 'collection', array(
    'required' => false, 
    'allow_add' => true, 
    'prototype' => true, 
    'by_reference' => false, 
    'type' => new GameBetType(), 
    'cascade_validation' => true 
)); 
Cuestiones relacionadas