Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Problemas al crear registro mediante servicios

8 de septiembre de 2015

Hola a todos,

Estoy intentando crear una entidad usando servicios y handler. Mi problema es que no me funciona, les dejo una parte del código a ver si me pueden colaborar, quizá sea algo que estoy pasando por alto, pero llevo dos días y no me funciona.

Este es el error que me sale al intentar enviar el formulario:

Catchable Fatal Error: Argument 1 passed to AppBundle\Model\AddressModel::__construct() must be an 
instance of AppBundle\Entity\Address, none given,
called in /../src/AppBundle/Handler/AddressHandler.php on line 64 and defined

Esta es la parte del AddressHandler que contiene la línea 64:

public function post(array $parameters)
{
    $class = $this->entityClass;
    $entity = new $class; // esta es la línea 64
    return $this->processForm($entity, $parameters, 'PUT');
}

Este es el constructor del AddressHandler:

protected $em;
protected $entityClass;
protected $repository;
protected $formFactory;
 
public function __construct(EntityManager $em, $entityClass, FormFactory $formFactory)
{
    $this->em = $em;
    $this->entityClass = $entityClass;
    $this->repository = $this->em->getRepository($this->entityClass);
    $this->formFactory = $formFactory;
}

Y este es el servicio que declaro donde paso la entidad:

parameters:
        app.address.class: AppBundle\Entity\Address
        app.address.handler.class: AppBundle\Handler\AddressHandler

services:
    app.handler.address_handler:
        class: %app.address.handler.class%
        arguments: ["@doctrine.orm.entity_manager", "%app.address.class%", "@form.factory"]

Si es necesario que adicione mas código para aclarar conceptos, lo haré con gusto.


Respuestas

#1

¿Puedes hacer un dump($class) justo encima de la línea 64 ($entity = new $class;) para ver cuál es su valor en ese punto?

@javiereguiluz

8 septiembre 2015, 22:17
#2

Hola Javier

Pues esto es lo que aparece en la linea 64, lo curioso es que efectivamente está pasando la entidad.

dump()
 
in AddressHandler.php line 64:public function post(array $parameters)
    {
        $class = $this->entityClass;
        dump($class);
        $entity = new $class;
        return $this->processForm($entity, $parameters, 'PUT');
    }
 "AppBundle\Entity\Address"

@miguelplazasr

9 septiembre 2015, 4:55
#3

Lo más extraño es que el error menciona que hay un problema en el constructor de una clase que no has mencionado: Argument 1 passed to AppBundle\Model\AddressModel::__construct(). No entiendo muy bien dónde se hace el new AddressModel() que está mal y que debería ser new AddressModel($address).

@javiereguiluz

9 septiembre 2015, 8:14
#4

La Entidad Address extiende de AddressModel donde está el constructor para no pegar más código , dejo la URL del repositorio GIT

Aparte de esto, tengo la entidad Persona que esta construida de la misma forma pero en esta todo funciona bien.

Gracias

@miguelplazasr

9 septiembre 2015, 14:04
#5

Hola Miguel. Creo que el problema este:

En el constructor de AddressModel estás inyectando Address y Address lo extiendes de AddressModel.

Por eso, cuando creas la instancia de Address en el handler te pide que pases ese parámetro porque lo hereda de de su padre. Es decir: tienes que instanciar la misma clase :|. Un ciclo medio raro... Personalmente, siempre extiendo las entidades de ORM No entiendo bien para qué necesitas instanciar una entity de un Model. ¿No sería mejor extender un Model de la entity? Cuestiones personales...

Que se abra el debate :D

@cristian_angulo

9 septiembre 2015, 19:56
#6

Hola Cristian, efectivamente tenias razón ese era el problema.

Ahora, la idea que tenia era dejar la Entity lo mas simple que se pudiera y para esto estaba utilizando el Model pero la herencia me ha traído inconvenientes, antes usaba el CRUD que trae Symfony y la verdad no había tenido ningún problema pero ahora con la implementación de RESTful me he dado cuenta que haciendo abstracción de código se pueden lograr también buenos resultados y el código se ve mucho más profesional. Además que de esta forma he activado muchas neuronas, pues hacer el CRUD automático me estaba volviendo perezoso. Creo que voy a dejar de un lado el Model pues analizando lo que me dices no tiene sentido usarlo.

Te agradezco mucho la ayuda, el cambio ya lo realice y esta funcionando a la perfección.

saludos..

@miguelplazasr

9 septiembre 2015, 23:20