ContextErrorException:警告:spl_object_hash()期望参数1为object,给定

时间:2015-12-07 20:37:27

标签: php symfony doctrine-orm

我知道有很多人要求这个错误,但我试图找到我的错误,但我不能。

首先,我使用FOSUSERBUNDLE来管理我的用户。我需要管理三个不同的用户,所以我从fosuserbundle扩展了主要实体用户,我创建了另外3个实体,这些实体的字段是对我的用户实体的引用。直到这项工作正常。

现在,我有一个名为SolicituIngreso.php的实体,它可以改变这3个不同的用户。我告诉你下面的实体:

class Usuario extends BaseUser
{
 /**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
 protected $id;

 public function __construct()
 {
    parent::__construct();

}
/** @ORM\column(type="string", length=255,nullable=true) 
*
*@Assert\NotBlank(message="Por favor ingrese su nombre.")
*@Assert\Length(
 *     min=1,
 *     max=255,
 *     minMessage="El nombre es demasiado corto.",
 *     maxMessage="El nombre es demasiado largo.")
**/
protected $nombre;

/** @ORM\column(type="string", length=255,nullable=true) 
*
*@Assert\NotBlank(message="Por favor ingrese su apellido.")
** @Assert\Length(
 *     min=1,
 *     max=255,
 *     minMessage="El nombre es demasiado corto.",
 *     maxMessage="El nombre es demasiado largo.")
**/
protected $apellido;
 ...

我的一个实体引用我的Usuario.php的示例:

class EncargadoBodega
{
    /** 
    * @ORM\Id
    * @ORM\ManyToOne(targetEntity="GestionResiduos\UsuarioBundle\Entity\Usuario", cascade={"all"}, inversedBy="encargadoBodega")
    * @ORM\JoinColumn(name="encargadoBodega_id", referencedColumnName="id")
    */
    protected $encargadoBodega;

和其他领域有吸气剂和制定者。

最后这是我的实体SolicitudIngreso.php:

class SolicitudIngreso
{
    /**
    *@ORM\Id
    *@ORM\column(type="integer")
    *@ORM\GeneratedValue(strategy="AUTO")
    */
    protected $numeroSolicitud;
    /**
    * @ORM\ManyToOne(targetEntity="GestionResiduos\ResiduoBundle\Entity\Bodega", cascade={"all"}, inversedBy="solicitudesIngreso")
    * @ORM\JoinColumn(name="bodegaAsociadaIngreso_id", referencedColumnName="idBodega") 
    */  
    protected $bodegaAsociadaIngreso;
   /**
    * @ORM\ManyToOne(targetEntity="GestionResiduos\UsuarioBundle\Entity\OperarioBodega", cascade={"all"}, inversedBy="solicitudesIngresoOpB")
    * @ORM\JoinColumn(name="operarioBodega_id", referencedColumnName="userOperarioBodega_id") 
    */        
    protected $operarioBodega;

/**
    * @ORM\ManyToOne(targetEntity="GestionResiduos\UsuarioBundle\Entity\OperarioGenerador", cascade={"all"}, inversedBy="solicitudesIngresoOpG")
    * @ORM\JoinColumn(name="operarioGenerador_id", referencedColumnName="userGenerador_id") 
    */     
    protected $operarioGenerador;

/**
    * @ORM\column(type="text", nullable=true) 
    */      
    protected $obsEncargadoBodega;

我在这个实体中有另外一个字段,但我认为如果我为一个实体求解,我可以做另一个实体。

顺便说一句,在我的控制器中,我只向你展示了我遇到问题的两种方法:

class DefaultController extends Controller
{
    public function crearSolicitudIngresoAction(Request $request)
    {
        $solicitudIngreso = new SolicitudIngreso();
        $ingresoResiduo= new IngresoResiduo();
        $userManager = $this->container->get('fos_user.user_manager');
        $temp = $userManager->findUserByUsername($this->getUser());
        $em = $this->getDoctrine()->getManager();
        $numeroOperario= $temp->getId();
        $operarioGenerador= $em->getRepository('UsuarioBundle:OperarioGenerador')->findOperarioGenerador($numeroOperario);
        $formulario = $this->createForm(new IngresoResiduoType(), $ingresoResiduo);
        $dateTime = new \DateTime();
        $residuos = $em->getRepository('ResiduoBundle:Residuo')->findResiduoCampos();
        $formulario->handleRequest($request);
        if($formulario->isValid())
        {
            $bandera=$solicitudIngreso->getEstadoSolicitud();
            if(($bandera != ""))
            {
             return $this->redirect($this->generateUrl('solicitud_ingreso_pendientes_opg'));
         }
            $solicitudIngreso->setEstadoSolicitud("AOR"); //ADD OTRO RESIDUO
            $solicitudIngreso->setFechaSolicitud($dateTime);
            $solicitudIngreso->setObsOperarioGenerador($formulario->get('numeroSolicitud')['obsOperarioGenerador']->getData());
            $solicitudIngreso->setDepartamentoGenerador($formulario->get('numeroSolicitud')['departamentoGenerador']->getData());

            $formulario->get('numeroSolicitud')['obsOperarioGenerador']->getData();
            $em->persist($solicitudIngreso);
            //$solicitudIngreso->setEstadoSolicitud("AOR"); //Espera Aprobación Ingreso
            $em->flush();
            $numeroSolicitud = $solicitudIngreso->getNumeroSolicitud();
            $ingresoResiduo->setNumeroSolicitud($solicitudIngreso);
            $em->persist($ingresoResiduo);
            $em->flush();
            if ($operarioGenerador) {
                $solicitudIngreso->setOperarioGenerador($operarioGenerador);    
                $em->persist($solicitudIngreso);
                $em->flush();
            }
            /**********new code for manage more than one residuo**************/
            if ($formulario->get('addotro')->isClicked()){//acá meto un render y le paso la variable con el residuo a ingresar.
                return $this->redirect($this->generateUrl(
                    'add_residuo_solicitud', array(
                        'idsolicitud' => $numeroSolicitud
                        )));
            } 
            $solicitudIngreso->setEstadoSolicitud("EAI"); //Espera Aprobación Ingreso
            $em->persist($solicitudIngreso);
            $em->flush();
            return $this->redirect($this->generateUrl(
                'detalle_pendiente_opg', array(
                    'id' => $numeroSolicitud
                    )));
        }
        return $this->render('SolicitudIngresoBundle:Default:crearSolicitudIngreso.html.twig', array(
            'formulario' => $formulario->createView(),
            'residuos' => $residuos
            ));
    }

public function addResiduoIngresoSolicitudIngresoAction(Request $request, $idsolicitud){
        $numeroSolicitud =$idsolicitud;
        $ingresoResiduo= new IngresoResiduo();
        $em = $this->getDoctrine()->getManager();
        $formulario = $this->createForm(new AddNuevoResiduoType(), $ingresoResiduo);
        $formulario->handleRequest($request);
        if($formulario->isValid())
        {
            $solicitudIngreso=$em->getRepository('SolicitudIngresoBundle:SolicitudIngreso')->findSolicitudIngreso($numeroSolicitud);
            $ingresoResiduo->setNumeroSolicitud($solicitudIngreso);
            $em->persist($ingresoResiduo);
            $em->flush();
            if ($formulario->get('addotro')->isClicked()) {
                return $this->redirect($this->generateUrl(
                    'add_residuo_solicitud', array(
                        'idsolicitud' => $numeroSolicitud
                        )));
            }
            $em->persist($solicitudIngreso);
            $em->flush();
            return $this->redirect($this->generateUrl(
                'detalle_pendiente_opg', array(
                    'id' => $numeroSolicitud
                    )));
        }
        $residuosAdd= $em->getRepository('SolicitudIngresoBundle:IngresoResiduo')->findIngresoResiduos($idsolicitud);
        $residuos = $em->getRepository('ResiduoBundle:Residuo')->findResiduoCampos();
        return $this->render('SolicitudIngresoBundle:Default:addResiduoSolicitudIngreso.html.twig', array(
            'formulario' => $formulario->createView(),
            'residuosincluidos' => $residuosAdd,
            'id' => $idsolicitud,
            'residuos' => $residuos
            ));
    }

我正在使用alter entity solicitudIngreso.php的表单。

当我尝试坚持使用函数

时,问题就出现了问题
  

addResiduoIngresoSolicitudIngresoAction

并且翻出下一个错误:

  

ContextErrorException:警告:spl_object_hash()期望参数1为object,字符串在C:\ xampp \ htdocs \ Gestionresiduospel \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ UnitOfWork.php第1602行中给出

我认为如果我添加我的表单可能会对您有所帮助:在这种情况下,我称之为addotro,此表单为 AddNuevoResiduoType 。所以,当我再次拨打按钮addotro或尝试按钮crear Trowing错误。

我想这可能是因为我的3个实体引用了Usuario实体。但我无法解决错误。我真的希望你能帮助我们。

2 个答案:

答案 0 :(得分:0)

你好我想你需要看一下函数addResiduoIngresoSolicitudIngresoAction

中会发生什么

在这一行

$solicitudIngreso=$em->getRepository('SolicitudIngresoBundle:SolicitudIngreso')->findSolicitudIngreso($numeroSolicitud);

我不确定存储库函数中发生了什么,但是您可能会返回一个字符串,其中对象IngresoResiduo期望是一个整数并尝试保留它。

或者此变量可以是字符串$numeroSolicitud =$idsolicitud;,然后设置为doctrine期望为整数的属性。

您可以通过添加验证来避免这种情况。您还可以尝试缩短方法名称和变量,或者将某些逻辑移动到服务中以使代码更具可读性。通过它需要更长的时间。

希望我的建议有所帮助。如果你解决了这个问题,请告诉我!

答案 1 :(得分:0)

我终于解决了我的问题。好吧,我检查我的实体,发现在我的实体中,我正在检查字段operarioBodega和operarioGenerador的级联验证,所以我删除了这个检查,一切正常。所以我认为这是因为当我要求getId()为我的operariogenerador获取我的id时,我得到一个字符串原因是fosuserbundle,它使用整数但我的operariogenerador打印用户名。我希望这可能对另一个有这个问题的人有用。超