Expected argument of type "string or Symfony\Component\Form\FormTypeInterface"

3.3k Views Asked by At

the error that arises in symfony is as follows:

Expected argument of type "string or Symfony\Component\Form\FormTypeInterface", "Proyecto\LavocBundle\Entity\Datos" given

I will not put all code so that it does not become too large , I think the problem is in the Type:

DatosType:

    <?php

namespace Proyecto\LavocBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class DatosType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) 
    {
        $builder->add('empresa');
        $builder->add('cuit');
        $builder->add('localidad');
        $builder->add('calle');
        $builder->add('altura');
        $builder->add('areaTel');
        $builder->add('telefono');
        $builder->add('areaCel');
        $builder->add('celular');
        $builder->add('email');
    }

    public function getName()
    {
    return 'datos_form';
    }

}

UserType:

    <?php

namespace Proyecto\LavocBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class UserType extends AbstractType 
{
    public function buildForm(FormBuilderInterface $builder, array $options) 
    {
        $builder->add('usuario');
        $builder->add('pass');
    }

    public function getName() 
    {
        return 'user_form';
    }
}

RegistroUsuarioType (this is the embedded form) :

<?php

namespace Proyecto\LavocBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Proyecto\LavocBundle\Entity\Datos;



class RegistroUsuarioType extends AbstractType 
{
    public function buildForm(FormBuilderInterface $builder, array $options) {
        parent::buildForm($builder, $options);

        $builder->add('usuario', 'text');
        $builder->add('pass', 'text');
        $builder->add('datos', new Datos());
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Proyecto\LavocBundle\Entity\User'
        ));
    }

    public function getName() {
        return 'RegistroUsuario_form';
    }
}

TablaController:

public function crearUsuarioDatosAction()
    {
        $request = $this->getRequest();
        $usuario = new User();
        $datos = new Datos();
        $usuario->setDatos($datos);

        $form = $this->createForm(new RegistroUsuarioType(), $usuario);


        if($request->getMethod() == 'POST')
            {
                        $form->bind($request);


                if( $form->isValid() )
                    {
                        $em = $this->getDoctrine()->getEntityManager();
                        $em->persist($form);
                        $em->flush();

                    return $this->redirect($this->generateUrl('home'));

                    }



            }

            return $this->render('AtajoBundle:IngresarValores:crearUsuarioDatos.html.twig', array('form' => $form->createView()));

    }

I thank you all very grateful for your help

1

There are 1 best solutions below

3
On BEST ANSWER
    $builder->add('datos', new Datos());

should be

    $builder->add('datos', new DatosType());

Also your DatosType needs the data_class property set, add this function to your DatosType class:

public function setDefaultOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Proyecto\LavocBundle\Entity\Datos',
    ));
}

For newer versions of Symfony2 configureOptions instead of setDefaultOptions

Make sure your DatosType has:

use Symfony\Component\OptionsResolver\OptionsResolverInterface;