0

语境

$_SESSION我需要使用 Doctrine 2.3(使用 PHP 5.4)将实体保持在会话中,一旦设置了变量,我就会遇到问题。

代码

我有以下课程:

持久的

用于保存有关持久类的信息的超类。

/**
 * @MappedSuperclass
 */
abstract class Persistente
{
    public function __construct()
    {}

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * @Id
     * @GeneratedValue
     * @Column(type="integer")
     */
    protected $id;
}

角色

保存一个人的基本信息。

/**
 * @Entity
 * @AttributeOverrides({
 *      @AttributeOverride(name="id",
 *          column=@Column(
 *              name="Persona_Id",
 *              type="integer"
 *          )
 *      )
 * })
 */
class Persona extends Persistente
{
    ...

    public function getContInformacion()
    {
        return $this->contInformacion;
    }

    public function setContInformacion(ContenedorInformacion $contInformacion)
    {
        $this->contInformacion = $contInformacion;
    }

    ...

    /**
     * @OneToOne(targetEntity="ContenedorInformacion", cascade={"all"}  )
     * @JoinColumn(name="ContInfo_Id", referencedColumnName="ContInfo_Id")
     */
    private $contInformacion;

}

竞争者信息

包含有关人员的信息的类,可以根据某些验证规则将其动态添加到对象中。

/**
 * @Entity
 * @AttributeOverrides({
 *      @AttributeOverride(name="id",
 *          column=@Column(
 *              name="ContInfo_Id",
 *              type="integer"
 *          )
 *      )
 * })
 */
class ContenedorInformacion extends Persistente
{
    ...

    /**
     * @OneToMany(targetEntity="UnidadInformacion", mappedBy="contInformacion", cascade={"all"}, indexBy="clave")
     */
    private $unidadesInformacion;

    /**
     * @OneToMany(targetEntity="Rol", mappedBy="contInformacion", cascade={"all"}, indexBy="clave")
     */
    private $roles;

}

问题

每当我添加Persona到会话时,都会执行以下代码:

public function login(Persona $t)
{
    if ($this->autorizar($t) === false) {
        return false;
    }
    $dao = new DAOManejadorMsSql();
    $daoPersona = $dao->fabricarDAO("\Codesin\Colegios\Personas\Persona");
    $t = $this->buscarPersona($t);
    $daoPersona->soltar($t);
    $dao->cerrar();
    $_SESSION['usuario'] = $t;
    if ($t->getContInformacion()->existeRol('SYSADMIN') === true) {
        return 'SYSADMIN';
    }
}

soltar()从 EntityManager执行detach()方法,有效地使实体不受管理。但是,ContenedorInformacion里面的对象Persona是 Doctrine 生成的代理,而不是想要的对象。为什么会这样?事先谢谢你。

编辑:这是错误。

Warning: require(C:\xampp\htdocs/Zeus/lib/vendor/DoctrineProxies/__CG__/Codesin/Colegios/Personas/ContenedorInformacion.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Zeus\Common\Utils\autoload.php on line 8

Fatal error: require(): Failed opening required 'C:\xampp\htdocs/Zeus/lib/vendor/DoctrineProxies/__CG__/Codesin/Colegios/Personas/ContenedorInformacion.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\Zeus\Common\Utils\autoload.php on line 8
4

1 回答 1

0

我不得不使用一种非常粗暴的方法。

我想出了以下几点:鉴于我不会立即重新附加信息,我重新制作了另一个ContenedorInformacion包含与代理完全相同的信息的信息。鉴于ArrayCollections 没有使用代理,而是使用整个对象,我这样做了。

public function login(Persona $t)
{
    if ($this->autorizar($t) === false) {
        return false;
    }
    $dao = new DAOManejadorMsSql();
    $daoPersona = $dao->fabricarDAO("\Codesin\Colegios\Personas\Persona");
    $t = $this->buscarPersona($t);
    $daoPersona->soltar($t);
    $dao->cerrar();
    /***** NEW LINES START HERE *****/
    $contInfo = new ContenedorInformacion();
    $contInfo->setId($t->getContInformacion()->getId());
    $contInfo->setUnidadesInformacion(new ArrayCollection($t->getContInformacion()->getUnidadesInformacion()->toArray()));
    $contInfo->setRoles(new ArrayCollection($t->getContInformacion()->getRoles()->toArray()));
    $t->setContInformacion($contInfo);
    /***** NEW LINES END HERE *****/
    $_SESSION['usuario'] = $t;
    if ($t->getContInformacion()->existeRol('SYSADMIN') === true) {
        return 'SYSADMIN';
    }
}

它很脏,但它就像一个魅力。

于 2013-06-27T07:04:12.157 回答