Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Warning: spl_object_hash() expects parameter 1 to be object, integer given in /var/ww

Estas en el tema de Warning: spl_object_hash() expects parameter 1 to be object, integer given in /var/ww en el foro de Symfony en Foros del Web. Buenas, ahora que he conseguido crear los setters y getters y parece que mi relación One-To-One, Self-referencing está correcta, al crear el controlador index , ...
  #1 (permalink)  
Antiguo 20/11/2014, 14:17
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Warning: spl_object_hash() expects parameter 1 to be object, integer given in /var/ww

Buenas, ahora que he conseguido crear los setters y getters y parece que mi relación One-To-One, Self-referencing está correcta, al crear el controlador index , me sale este error que no entiendo.

Código:
Warning: spl_object_hash() expects parameter 1 to be object, integer given in /var/ww
El código es muy sencillito ,estoy solo testeando por ahora.

Código:
<?php

namespace Book\MainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Book\MainBundle\Entity\Book;

class DefaultController extends Controller
{
    public function indexAction($book)
    {
      
        $book = new Book();
       
        $book->setPhrase('Continua...');
        $book->setParentBranch(1);
        $book->setCreatorUid(1);
         var_dump($book);
        $em = $this->getDoctrine()->getManager();
        $em->persist($book);
        $em->flush();
        
        return $this->render('BookMainBundle:Default:index.html.twig', array('book' => $book));
    }
}
Por cierto, al layout index.html.twig llegan los datos correctamente , por lo que no entiendo el error.

Un saludo y gracias de antemano.
__________________
Videotutoriales de Drupal
  #2 (permalink)  
Antiguo 20/11/2014, 14:40
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Me auto-respondo, aquí http://obtao.com/blog/symfony2-issue...ot-understand/ comentan lo siguiete:

Cita:
3) Warning: spl_object_hash() expects parameter 1 to be object, string given in XXXX

The error is quite explicit : you have defined a string (or something else) instead of an object.

You need to check what is set in your main objet. If you use a form, you probably have a field type error (choice or text instead of entity for example). To solve this, you may need to use a Data Transformer
Pero no entiendo muy bien a que se refiere, mis campos de la tabla son tipo integer dos de ellos ParentBranch y CreatorUid y Phrase tipo string, no se que quiere decir, ¿alguien me puede echar un cable con esto?.

Gracias de antemano.
__________________
Videotutoriales de Drupal
  #3 (permalink)  
Antiguo 20/11/2014, 15:47
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Cita:
Iniciado por Dundee Ver Mensaje

Pero no entiendo muy bien a que se refiere, mis campos de la tabla son tipo integer dos de ellos ParentBranch y CreatorUid y Phrase tipo string, no se que quiere decir, ¿alguien me puede echar un cable con esto?.

Gracias de antemano.
El problema es que estas pensando en terminos de tablas y doctrine usa objetos de tal forma que tus relaciones deben de recibir objetos no enteros, es lo que te trata de decir el error.
Publica las entidades que están involucradas para ver sus relaciones por que a simple vista con los nombres que usas en tu ejemplo de arriba no se aprecia que es lo que estas haciendo, pero supongo que alguno de estos dos métodos es el problema.
Código PHP:
Ver original
  1. $book->setParentBranch(1);
  2. $book->setCreatorUid(1);
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 20/11/2014, 15:57
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Ok, es una relación tipo "One-To-One, Self-referencing", el código es este:

Código:
<?php

namespace Book\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Book
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Book\MainBundle\Entity\BookRepository")
 */
class Book
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO") 
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="phrase", type="string", length=255)
     */
    private $phrase;

    /**
     * @var integer
     * @ORM\OneToOne(targetEntity="Book")
     * @ORM\JoinColumn(name="parent_branch", referencedColumnName="id")
     */
    private $parentBranch;


    /**
     * @var integer
     *
     * @ORM\Column(name="creator_uid", type="integer")
     */
    private $creatorUid;

    
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set phrase
     *
     * @param string $phrase
     * @return Book
     */
    public function setPhrase($phrase)
    {
        $this->phrase = $phrase;

        return $this;
    }

    /**
     * Get phrase
     *
     * @return string 
     */
    public function getPhrase()
    {
        return $this->phrase;
    }

    /**
     * Set parentBranch
     *
     * @param integer $parentBranch
     * @return Book
     */
    public function setParentBranch($parentBranch)
    {
        $this->parentBranch = $parentBranch;

        return $this;
    }

    /**
     * Get parentBranch
     *
     * @return integer 
     */
    public function getParentBranch()
    {
        return $this->parentBranch;
    }


    /**
     * Set creatorUid
     *
     * @param integer $creatorUid
     * @return Book
     */
    public function setCreatorUid($creatorUid)
    {
        $this->creatorUid = $creatorUid;

        return $this;
    }

    /**
     * Get creatorUid
     *
     * @return integer 
     */
    public function getCreatorUid()
    {
        return $this->creatorUid;
    }
}
Efectivamente si comento:
//$book->setParentBranch(1);

funciona !!!, pero no entiendo porqué ahí no puedo pasarle un integer, precisamente ese el el campo que actúa como foreign key en mi tabla.
__________________
Videotutoriales de Drupal

Última edición por Dundee; 20/11/2014 a las 16:02
  #5 (permalink)  
Antiguo 20/11/2014, 16:44
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Muy bien el método setParentBranch espera recibir un objeto de tipo Book como "parent" perro para que esto sea posible primero debes de tener el parent antes que el libro.
Código PHP:
Ver original
  1. $em = $this->getDoctrine()->getManager();
  2.  
  3. $parent_book = new Book();
  4. $parent_book->setPhrase('Continua...');
  5.  
  6. //guardas parent
  7. $em->persist($parent_book);
  8.  
  9. $book = new Book();
  10. $book->setPhrase('Bla, bla..');
  11. $book->setParentBranch($parent_branch);
  12. $book->setCreatorUid(1);// si esto es una relación necesitas delcararla tambien
  13.  
  14. $em->persist($book);
  15. $em->flush();
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #6 (permalink)  
Antiguo 21/11/2014, 03:32
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Cita:
Iniciado por hhs Ver Mensaje
Muy bien el método setParentBranch espera recibir un objeto de tipo Book como "parent" perro para que esto sea posible primero debes de tener el parent antes que el libro.
Código PHP:
Ver original
  1. $em = $this->getDoctrine()->getManager();
  2.  
  3. $parent_book = new Book();
  4. $parent_book->setPhrase('Continua...');
  5.  
  6. //guardas parent
  7. $em->persist($parent_book);
  8.  
  9. $book = new Book();
  10. $book->setPhrase('Bla, bla..');
  11. $book->setParentBranch($parent_branch);
  12. $book->setCreatorUid(1);// si esto es una relación necesitas delcararla tambien
  13.  
  14. $em->persist($book);
  15. $em->flush();
Ok, gracias , lo he podido resolver con tu ayuda así:

En el controller

Código:
public function createAction(Request $request){
      
        $em = $this->getDoctrine()->getManager();
      
       // crea una task y le asigna algunos datos ficticios para este ejemplo
        $parent_book = new Book();
        $parent_book->setId(1);
        
         
        //guardas parent
        $em->persist($parent_book);

        $book = new Book();
        $book->setPhrase('Write a blog post');
        $book->setParentBranch($parent_book->getId());
       // $book->setDueDate(new \DateTime('tomorrow'));
        $book->setCreatorUid(1);
 
        $form = $this->createFormBuilder($book)
            ->add('phrase', 'text')
            ->add('parent_branch', 'integer')
            ->add('creator_uid', 'integer')
          //  ->add('dueDate', 'date')
            ->add('save', 'submit')
            ->getForm();
 
        $form->handleRequest($request);
 
        if ($form->isValid()) {
            // guardar la tarea en la base de datos

            return $this->redirect($this->generateUrl('task_success'));
        }
            return $this->render('BookMainBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    
    }
Y la entidad (modelo), he creado un nuevo setter para Id:
Código:
 public function setId($id)
    {
        return $this->id;
    }
Mil gracias
__________________
Videotutoriales de Drupal
  #7 (permalink)  
Antiguo 21/11/2014, 04:13
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Bueno me vuelvo a encontrar con el mismo error al intentar guardar el objeto en la bd, la verdad que no lo entiendo, porque es un objeto , ¿por qué dice que es un entero?.

Código:
public function createAction(Request $request){
      
        $em = $this->getDoctrine()->getManager();
      
       // crea una task y le asigna algunos datos ficticios para este ejemplo
        $parent_book = new Book();
        $parent_book->setId(2); 
//Esta es la Id metida a mano, para ello he creado su setter y getter pertinentes.
        
        var_dump($parent_book);
        //guardas parent
        $em->persist($parent_book);

        $book = new Book();
        $book->setPhrase('Write a blog post');
        $book->setParentBranch($parent_book->getId());
       // $book->setDueDate(new \DateTime('tomorrow'));
        $book->setCreatorUid(1);

        $form = $this->createFormBuilder($book)
            ->add('phrase', 'text')
            ->add('parentBranch', 'integer')
            ->add('creatorUid', 'integer')
          //  ->add('dueDate', 'date')
            ->add('save', 'submit')
            ->getForm();
 
        $form->handleRequest($request);
 
        if ($form->isValid()) {
            // guardar la tarea en la base de datos
            $em = $this->getDoctrine()->getManager();
            $em->persist($book);
            $em->flush();

            return $this->redirect($this->generateUrl('task_success'));
        }
            return $this->render('BookMainBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    
    }
Código:
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    
     /**
     * Set id
     *
     * @return integer 
     */
    public function setId($id)
    {
        $this->id = $id;
        return $this->id;
    }
Gracias de antemano.
__________________
Videotutoriales de Drupal
  #8 (permalink)  
Antiguo 21/11/2014, 10:13
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

No requieres un setId() para Book
Código PHP:
Ver original
  1. class Book
  2. {
  3.     /**
  4.      * @var integer
  5.      *
  6.      * @ORM\Column(name="id", type="integer")
  7.      * @ORM\Id
  8.      * @ORM\GeneratedValue(strategy="AUTO")
  9.      */
  10.     private $id;
Con esto el Id se genera de forma automática.
Esto no es necesario:
Código PHP:
Ver original
  1. $book->setParentBranch($parent_book->getId()); // no es necesario
  2. $book->setParentBranch($parent_book); //correcto, recuerda que las relaciones son con otros objetos
En el formulario el campo parentBranch debe de ser un "entity" no un entero:
Código PHP:
Ver original
  1. ->add('parentBranch', 'entity') //no puede ser integer
debes de tener dos operaciones para esto, en una solo agregas los "Branch" y en otra los libros para que tengas algo que mostrar en el campo parentBranch.
Y por ultimo deja de pensar en términos del modelo ER, en el código son objetos asi que todos los tipos de relaciones son entre objetos, doctrine se encarga guardar todo de forma correcta en la base de datos.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 21/11/2014, 10:28
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Cita:
Iniciado por hhs Ver Mensaje
No requieres un setId() para Book
Código PHP:
Ver original
  1. class Book
  2. {
  3.     /**
  4.      * @var integer
  5.      *
  6.      * @ORM\Column(name="id", type="integer")
  7.      * @ORM\Id
  8.      * @ORM\GeneratedValue(strategy="AUTO")
  9.      */
  10.     private $id;
Con esto el Id se genera de forma automática.
Esto no es necesario:
Código PHP:
Ver original
  1. $book->setParentBranch($parent_book->getId()); // no es necesario
Buenas, te comento , el getId si lo necesito, porque ese Id ya existe en la base de datos, lo que quiero es relacionar el nuevo book con su parent (uno que ya existe). Por lo demás lo de entity no lo había leído por ningún sitio, voy a investigar; mil gracias.
Un saludo
__________________
Videotutoriales de Drupal
  #10 (permalink)  
Antiguo 21/11/2014, 10:40
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Cita:
Iniciado por Dundee Ver Mensaje
Buenas, te comento , el getId si lo necesito, porque ese Id ya existe en la base de datos, lo que quiero es relacionar el nuevo book con su parent (uno que ya existe). Por lo demás lo de entity no lo había leído por ningún sitio, voy a investigar; mil gracias.
Un saludo
Mientras sigas pensando de esa forma vas a tener muchos problemas, ya que no estas comprendiendo como funciona Doctrine.
La documentación es muy amplia y detallada: http://symfony.com/doc/current/book/...in-field-types
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #11 (permalink)  
Antiguo 21/11/2014, 11:14
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Cita:
Iniciado por hhs Ver Mensaje
Mientras sigas pensando de esa forma vas a tener muchos problemas, ya que no estas comprendiendo como funciona Doctrine.
La documentación es muy amplia y detallada: http://symfony.com/doc/current/book/...in-field-types
Antes de nada gracias por tu paciencia , pero te cuento. Entiendo que con lo que he explicado y con el código que he pegado , pienses eso, porque está muy lejos de lo que pretendo que es esto:

1 Después de una consulta a la Db o bien de haberle pasado una ID por URL o por POST (aún no se), dicha ID será la de una RAMA ya existente.

2 Ahora es cuando se crear la nueva RAMA (hija), que quiero relacionar con la otra ya existente (por eso la rama parent no puede generarse la ID de forma aleatoria ¿entiendes?.

El problema es que yo no he explicado desde el principio bien el asunto. Lo único que ahora estaba haciendo eran pruebas para entender todo mejor.

Gracias
__________________
Videotutoriales de Drupal
  #12 (permalink)  
Antiguo 21/11/2014, 11:23
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

No obstante ese problema parece estar ya resuelto al haber cambiado el tipo de dato a "entity" , pero ahora al guardar los datos en la db tengo un nuevo problema , porque los intenta guardar como null.

Para evitar más confusiones voy a pegar el código (con motivo de aprender buenas prácticas, he creado el form en una clase aparte para poder reutilizarlo cuando lo necesite).

Error:

Código:
An exception occurred while executing 'INSERT INTO Book (phrase, creator_uid, parent_branch) VALUES (?, ?, ?)' with params [null, null, null]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'creator_uid' cannot be null
DefaultController.php

Código:
<?php
namespace Book\MainBundle\Controller;


use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Book\MainBundle\Entity\Book;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Book\MainBundle\Form\Phrase\NewPhrase;

class DefaultController extends Controller
{
    public function indexAction($book)
    {
      
        $book = new Book();
       
        $book->setPhrase('erase una vez 3..');
        $book->setParentBranch(1);
        $book->setCreatorUid(1);
     
        $em = $this->getDoctrine()->getManager();
        $em->persist($book);
        $em->flush();
        
        return $this->render('BookMainBundle:Default:index.html.twig', array('book' => $book));
    }
    
    public function createAction(Request $request){
      
        $em = $this->getDoctrine()->getManager();
      
       // crea una task y le asigna algunos datos ficticios para este ejemplo
        $parent_book = new Book();
        $parent_book->setId(2);
        
        //guardas parent
        $em->persist($parent_book);

        $book = new Book();
        $book->setPhrase('Write a blog post');
        $book->setParentBranch($parent_book->getId());
       // $book->setDueDate(new \DateTime('tomorrow'));
        $book->setCreatorUid(1);
        /*
        $form = $this->createFormBuilder($book)
           // ->setAction($this->generateUrl('task_success'))
           // ->setMethod('GET')
            ->add('phrase', 'textarea', array('label'  => 'My phrase', 'max_length' => 500))
            ->add('parentBranch', 'integer')
            ->add('creatorUid', 'integer')
          //  ->add('dueDate', 'date')
            ->add('save', 'submit')
            ->getForm();
          */

        $form = $this->createForm(new NewPhrase(), $book);
        $form->handleRequest($request);
     
        if ($form->isValid()) {
            // guardar la tarea en la base de datos
            var_dump($book);
            $em = $this->getDoctrine()->getManager();
            $em->persist($book);
            $em->flush();

            return $this->redirect($this->generateUrl('task_success'));
        }
        // Default view.
            return $this->render('BookMainBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    
    }
    
    public function successAction(){
      
      return new Response('Formulario enviado correctamente');
      
    }

}
Book.php (la entidad)
Código:
<?php

namespace Book\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Book
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Book\MainBundle\Entity\BookRepository")
 */
class Book
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO") 
     */
    private $id;

    /**
     * @var string
     * @Assert\NotBlank()
     * @Assert\Length(
     *      min = 10,
     *      max = 500,
     *      minMessage = "Your phrase must be at least {{ limit }} characters long",
     *      maxMessage = "Your phrase cannot be longer than {{ limit }} characters long"
     * ) 
     * @ORM\Column(name="phrase", type="string", length=255)
     */
    private $phrase;

    /**
     * @var integer
     * @Assert\NotBlank()
     * @ORM\OneToOne(targetEntity="Book")
     * @ORM\JoinColumn(name="parent_branch", referencedColumnName="id")
     */
    private $parentBranch;


    /**
     * @var integer
     * @Assert\NotBlank()
     * @ORM\Column(name="creator_uid", type="integer")
     */
    private $creatorUid;

    
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    
     /**
     * Set id
     *
     * @return integer 
     */
    public function setId($id)
    {
        $this->id = $id;
        return $this->id;
    }

    /**
     * Set phrase
     *
     * @param string $phrase
     * @return Book
     */
    public function setPhrase($phrase)
    {
        $this->phrase = $phrase;

        return $this;
    }

    /**
     * Get phrase
     *
     * @return string 
     */
    public function getPhrase()
    {
        return $this->phrase;
    }

    /**
     * Set parentBranch
     *
     * @param integer $parentBranch
     * @return Book
     */
    public function setParentBranch($parentBranch)
    {
        $this->parentBranch = $parentBranch;

        return $this;
    }

    /**
     * Get parentBranch
     *
     * @return integer 
     */
    public function getParentBranch()
    {
        return $this->parentBranch;
    }


    /**
     * Set creatorUid
     *
     * @param integer $creatorUid
     * @return Book
     */
    public function setCreatorUid($creatorUid)
    {
        $this->creatorUid = $creatorUid;

        return $this;
    }

    /**
     * Get creatorUid
     *
     * @return integer 
     */
    public function getCreatorUid()
    {
        return $this->creatorUid;
    }
    
    public function __toString() 
    {
        return $this->phrase;
    }

}
Y por último la famosa clase
NewPhrase.php
Código:
<?php

// src/Acme/TaskBundle/Form/Type/TaskType.php
namespace Book\MainBundle\Form\Phrase;
 
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
 
class NewPhrase extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('phrase', 'text', array('label'  => 'My phrase', 'max_length' => 500))
            ->add('parentBranch', 'entity', array(
            'class' => 'BookMainBundle:Book',
            ))

            ->add('creatorUid', 'integer')
            ->add('save', 'submit');
    }
 
    // unique identifier for this form.
    public function getName()
    {
        return 'phrase';
    }
}
__________________
Videotutoriales de Drupal
  #13 (permalink)  
Antiguo 21/11/2014, 12:04
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Cita:
An exception occurred while executing 'INSERT INTO Book (phrase, creator_uid, parent_branch) VALUES (?, ?, ?)' with params [null, null, null]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'creator_uid' cannot be null
Generalmente esto sucede por que no existe validación en el método que procesa el formulario de tal forma que llega hasta las restricciones propias del DBMS.
Para solucionarlo depende de que necesites, si no requieres que siempre se proporcione el creator_uid, entonces le tienes que decir a la entidad que puedes aceptar nulos en ese campo; usando nullable=true
Código PHP:
Ver original
  1. /**
  2.      * @var integer
  3.      * @Assert\NotBlank()
  4.      * @ORM\Column(name="creator_uid", type="integer", nullable=true)
  5.      */
  6.     private $creatorUid;
Si no es asi, entonces entonces en el create algo no esta bien por que no te debiera dejar pasar la validación.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #14 (permalink)  
Antiguo 21/11/2014, 12:50
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Cita:
Iniciado por Dundee Ver Mensaje
Antes de nada gracias por tu paciencia , pero te cuento. Entiendo que con lo que he explicado y con el código que he pegado , pienses eso, porque está muy lejos de lo que pretendo que es esto:

1 Después de una consulta a la Db o bien de haberle pasado una ID por URL o por POST (aún no se), dicha ID será la de una RAMA ya existente.
Ok entiendo, las ramas padre ya están creadas previamente en la base de datos, solo requieres agregar una hija a cada rama padre.
Cita:
2 Ahora es cuando se crear la nueva RAMA (hija), que quiero relacionar con la otra ya existente (por eso la rama parent no puede generarse la ID de forma aleatoria ¿entiendes?.
si ya existen la rama padre es por que ya tiene un id relacionado en la base de datos por lo tanto el objeto ya conoce su id, solo requieres proporcionar el objeto que ya previamente seleccionaste en el paso 1.
Supongamos que pasaste el id en un listado previo.
Código PHP:
Ver original
  1. public function newBranchAction($id){
  2.         $em = $this->getDoctrine()->getManager();
  3.         //buscar la rama padre para este id
  4.         $parent = $em->getRepository('MainBundle:Book')->find($id);
  5.  
  6.         $book = new Book();
  7.         //asignas el parent
  8.         $book->setParentBranch($parent);
  9.  
  10.         $form = $this->createForm(new NewPhrase(),$book, array(
  11.                 'action' => $this->generateUrl('url_que_procesa_accion'),
  12.                 'method' => 'POST',
  13.             ));
  14.         //cuando se crea el formulario el campo parentBranch ya tiene el objeto que deseas
  15.         return $this->render('BookMainBundle:Default:new_branch.html.twig', array(
  16.                 'form' => $form->createView(),
  17.             ));
  18.  
  19.     }
Para manejar la inserción creas otro método
Código PHP:
Ver original
  1. public function createBranchAction(Request $request){
  2.         $book = new Book();
  3.  
  4.         $form = $this->createForm(new NewPhrase(),$book, array(
  5.                 'action' => $this->generateUrl('url_que_procesa_accion'),
  6.                 'method' => 'POST',
  7.             ));
  8.  
  9.         $form->handleRequest($request);
  10.  
  11.         if($form->isValid())
  12.         {
  13.             $em = $this->getDoctrine()->getManager();
  14.             $em->persist($book);
  15.             $em->flush();
  16.  
  17.             $this->get('session')->getFlashBag()->add(
  18.                 'success',
  19.                 'Se inserto correctamente'
  20.             );
  21.  
  22.             return $this->redirect($this->generateUrl('branch_show', array('id' => $book->getId())));
  23.         }
  24.  
  25.         return $this->render('BookMainBundle:Default:create_branch.html.twig', array(
  26.                 'book' => $book,
  27.                 'form' => $form->createView(),
  28.             ));
  29.  
  30.     }
Cuando el form hace el handleResquest obtiene los datos enviados por post y con estos el formulario se encarga de llenar la entidad. Si tienes una validación esta se ejecuta en la condición.
La parte del FlashBag lo puedes ver en la documentación: http://symfony.com/doc/current/book/...flash-messages
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #15 (permalink)  
Antiguo 21/11/2014, 13:49
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Cita:
Iniciado por hhs Ver Mensaje
Código PHP:
Ver original
  1. public function newBranchAction($id){
  2.         $em = $this->getDoctrine()->getManager();
  3.         //buscar la rama padre para este id
  4.         $parent = $em->getRepository('MainBundle:Book')->find($id);
  5.  
  6.         $book = new Book();
  7.         //asignas el parent
  8.         $book->setParentBranch($parent);
  9.  
  10.         $form = $this->createForm(new NewPhrase(),$book, array(
  11.                 'action' => $this->generateUrl('url_que_procesa_accion'),
  12.                 'method' => 'POST',
  13.             ));
  14.         //cuando se crea el formulario el campo parentBranch ya tiene el objeto que deseas
  15.         return $this->render('BookMainBundle:Default:new_branch.html.twig', array(
  16.                 'form' => $form->createView(),
  17.             ));
  18.  
  19.     }
Para manejar la inserción creas otro método
Código PHP:
Ver original
  1. public function createBranchAction(Request $request){
  2.         $book = new Book();
  3.  
  4.         $form = $this->createForm(new NewPhrase(),$book, array(
  5.                 'action' => $this->generateUrl('url_que_procesa_accion'),
  6.                 'method' => 'POST',
  7.             ));
  8.  
  9.         $form->handleRequest($request);
  10.  
  11.         if($form->isValid())
  12.         {
  13.             $em = $this->getDoctrine()->getManager();
  14.             $em->persist($book);
  15.             $em->flush();
  16.  
  17.             $this->get('session')->getFlashBag()->add(
  18.                 'success',
  19.                 'Se inserto correctamente'
  20.             );
  21.  
  22.             return $this->redirect($this->generateUrl('branch_show', array('id' => $book->getId())));
  23.         }
  24.  
  25.         return $this->render('BookMainBundle:Default:create_branch.html.twig', array(
  26.                 'book' => $book,
  27.                 'form' => $form->createView(),
  28.             ));
  29.  
  30.     }
Para ver si entiendo tu código esto creo que es lo que hace.

1 Primeramente buscas el "objeto" medianta su ID que se ha pasado a ese método de la forma que sea GET, PÔST o como sea.

2 Luego creas la nueva rama (aquí se llama Book a la clase, pero ya la he cambiado por branch que creo que es más claro).

3 A la propiedad de la clase Book del nuevo objeto creado la "asocio" a la PARENT (lo que sería su foreign key), para establecer la relación.

Pero ahora no entiendo porque creas un form, puesto que el PARENT no tiene que mostrarse en ningún form (sería un campo hidden en todo caso).

Bajo mi punto de vista un método solo es suficiente.

1 Obtener el objeto como tu haces mediante la ID
2 Crear el form y allí crear la nueva rama y pasarle (hidden o como sea) el PARENT, luego guardar y listo.

No entiendo como en el segundo método createBranchActio "sabes" de forma automática cual es el PARENT del nuevo BOOK, además estas creando un nuevo BOOK , no es el mismo del otro método. Lo siento pero debo ser muy torpe, pero ahí me perdí. Es que en createBranchActio no se menciona para nada a parent, y si lo vas a guardar en la db lo guardaría como NULL.

Gracias de antemano.
__________________
Videotutoriales de Drupal
  #16 (permalink)  
Antiguo 21/11/2014, 14:18
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Warning: spl_object_hash() expects parameter 1 to be object, integer given

Bueno , después de darle unas vueltas, y también viendo parte de tu código , he podido hacerlo con un solo método así:

NOTA: He cambiado el nombre de la clase y de la ENTIDAD de Book a Branch.
DefaultController.php
Código:
public function createBranchAction(Request $request){
      
        $em = $this->getDoctrine()->getManager();
        $parent_branch = new Branch();

// Esto es solo un ejemplo, lógicamente el (2) debe existir en la BD previamente, por lo que se pasaría al método createBranchAction como argumento.
        $parent_branch = $em->getRepository('BranchMainBundle:Branch')->find(2);
         
        //guardas parent
        $em->persist($parent_branch);

        $branch = new Branch();
        $branch->setPhrase('Write a blog post');
        $branch->setParentBranch($parent_branch);
       // $book->setDueDate(new \DateTime('tomorrow'));
        $branch->setCreatorUid(1);
        $form = $this->createForm(new NewPhrase(), $branch);
        $form->handleRequest($request);
     
        if ($form->isValid()) {
            // guardar la tarea en la base de datos
            var_dump($branch);
            $em = $this->getDoctrine()->getManager();
            $em->persist($branch);
            $em->flush();

            return $this->redirect($this->generateUrl('task_success'));
        }
        // Default view.
            return $this->render('BranchMainBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    
    }
La clase externa que genera el form.
NewPhrase.php

Código:
<?php

// src/Acme/TaskBundle/Form/Type/TaskType.php
namespace Branch\MainBundle\Form\Phrase;
 
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
 
class NewPhrase extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('phrase', 'text', array('label'  => 'My phrase', 'max_length' => 500))
            ->add('parentBranch', 'entity', array(
            'class' => 'BranchMainBundle:Branch',
            ))

            ->add('creatorUid', 'integer')
            ->add('save', 'submit');
    }
 
    // unique identifier for this form.
    public function getName()
    {
        return 'phrase';
    }
}

Mil gracias por tu ayuda, me ha aclarado cosas que no entendía del todo bien.
__________________
Videotutoriales de Drupal

Etiquetas: expects, integer, object, parameter, warning
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:03.