【问题标题】:Symfony 2.4 session in controller控制器中的 Symfony 2.4 会话
【发布时间】:2018-02-22 13:05:52
【问题描述】:

我有这个控制器:

<?php

namespace app\EmpleadosBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;

use app\EmpleadosBundle\Entity\Empleados;
use app\RolesEmpleadosBundle\Entity\RolesEmpleados;

use app\EmpleadosBundle\Service\Util;

session_start();

class DefaultController extends Controller
{
    public function loginAction(){
        //Siempre que abrimos la pagina limpiamos la session
        $this->get('session')->clear();
        return $this->render('EmpleadosBundle:Default:login.html.twig');
    }

    public function conexionAction(Request $request){
        $em = $this->getDoctrine()->getManager();
    $metodo=$request->getMethod();

    if($metodo=='POST'){
        //Obtenemos el n_empleado y la contraseña del formulario
        $nempleado = $request->request->get('nempleado');
        $password = $request->request->get('password');

        //Buscamos en la base de datos para comprobar si hay coincidencia
        $o_empleado = $em->getRepository('EmpleadosBundle:Empleados')->findBy(array(
            'nEmpleado' => $nempleado,
            'password' => $password
        ));

        //Si la consulta devuelve algun registro es que hay coindicendia
        //Almacenamos en session el empleado conectado y redirigimos a la funcion menu principal
        if(count($o_empleado)==1){
            $this->get('session')->set('empleado', $o_empleado);
            //...
    }
}
?>

在 conexionAction 的这一点上,我保存了一个 EmpleadosBundle:Empleados 类的对象,如果我在这一点打印会话是:

print_r($this->get('session')->get('empleado'));

Array
(
[0] => app\EmpleadosBundle\Entity\empleados Object
    (
        [id:app\EmpleadosBundle\Entity\empleados:private] => 47
        [nEmpleado:app\EmpleadosBundle\Entity\empleados:private] => 0000000002
        [nombre:app\EmpleadosBundle\Entity\empleados:private] => USUARIO DIRECCION FRONT
        [apellidos:app\EmpleadosBundle\Entity\empleados:private] => AAA
        [password:app\EmpleadosBundle\Entity\empleados:private] => 12qwaszx
        [email:app\EmpleadosBundle\Entity\empleados:private] => 
        [fechaAlta:app\EmpleadosBundle\Entity\empleados:private] => DateTime Object
            (
                [date] => 2017-08-29 16:39:50.000000
                [timezone_type] => 3
                [timezone] => UTC
            )

    )

)

在 conexionAction 函数结束时,我在同一个控制器中重定向到其他操作:

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

在这个函数中,会话对象发生了变化:

功能:

public function menuprincipalAction(){
    $em = $this->getDoctrine()->getManager();

    $empleado_conectado=$this->get('session')->get('empleado');

    if($empleado_conectado[0]!=''){
        $array_roles=array();
        $o_roles_empleado = $em->getRepository('RolesEmpleadosBundle:RolesEmpleados')->findBy(array('empleado'=>$empleado_conectado[0]->getId()));
    //...

如果我打印会话在这里:

print_r($this->get('session')->get('empleado'));

Array
(
[0] => __PHP_Incomplete_Class Object
    (
        [__PHP_Incomplete_Class_Name] => app\EmpleadosBundle\Entity\empleados
        [id:app\EmpleadosBundle\Entity\empleados:private] => 47
        [nEmpleado:app\EmpleadosBundle\Entity\empleados:private] => 0000000002
        [nombre:app\EmpleadosBundle\Entity\empleados:private] => USUARIO DIRECCION FRONT
        [apellidos:app\EmpleadosBundle\Entity\empleados:private] => AAA
        [password:app\EmpleadosBundle\Entity\empleados:private] => 12qwaszx
        [email:app\EmpleadosBundle\Entity\empleados:private] => 
        [fechaAlta:app\EmpleadosBundle\Entity\empleados:private] => DateTime Object
            (
                [date] => 2017-08-29 16:39:50.000000
                [timezone_type] => 3
                [timezone] => UTC
            )

    )

)

它变为一个不完整的类并给出致命错误并且不能使用该对象。

-- 编辑1--

我尝试了史蒂夫的解决方案,但它不起作用,它返回相同的错误:

我删除了 session_start() 行,删除这行就像会话没有开始一样。

我将尝试逐步解释该过程,看看我是否遗漏了什么:

1- 我在 Empleados Controller 中调用 loginAction,并清除会话:

$this->get('session')->clear();

然后我用登录表单渲染一个视图

2- 当我提交登录表单时,我在 Empleados Controller 中调用 conexionAction,在这里我检查了一些参数,如果一切正常,我保存和会话中的类 empleado 对象:

$this->get('session')->set('empleado',serialize($o_empleado));或 $this->get('session')->set('empleado',$o_empleado);

*注意:如果我在这里打印 $this->get('session') 我会完美地看到对象。

保存对象后,我重定向到同一控制器中的另一个操作:

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

3- 在前面的重定向中,我在 Empleados 控制器中调用 menuprincipalAction。在这里,如果我尝试打印对象,我会得到一个这样的数组:

Array
(
[0] => __PHP_Incomplete_Class Object
    (
        [__PHP_Incomplete_Class_Name] => app\EmpleadosBundle\Entity\empleados
        [id:app\EmpleadosBundle\Entity\empleados:private] => 47
        [nEmpleado:app\EmpleadosBundle\Entity\empleados:private] => 0000000002
        [nombre:app\EmpleadosBundle\Entity\empleados:private] => USUARIO DIRECCION FRONT
        [apellidos:app\EmpleadosBundle\Entity\empleados:private] => AAA
        [password:app\EmpleadosBundle\Entity\empleados:private] => 12qwaszx
        [email:app\EmpleadosBundle\Entity\empleados:private] => 
        [fechaAlta:app\EmpleadosBundle\Entity\empleados:private] => DateTime Object
            (
                [date] => 2017-08-29 16:39:50.000000
                [timezone_type] => 3
                [timezone] => UTC
            )

    )

)

我不明白为什么在第一个动作中对象的打印是正确的,但在第二个动作中却显示了不完整的类名

【问题讨论】:

标签: php symfony


【解决方案1】:

Smfony 几乎肯定会在你的控制器实例化之前开始一个会话,因此在 empledos 类加载之前。

您可以通过显式处理序列化来解决此问题:

//set
$this->get('session')->set('empleado', serialize($o_empleado));

//get
$empleado_conectado=unserialize($this->get('session')->get('empleado'));

【讨论】:

  • 好的我试试看,所以我需要删除session_start();行还是需要?因为你说:“Symfony 几乎肯定会在你的控制器实例化之前开始一个会话”
  • 是的,您应该删除该行。
【解决方案2】:

最后,在尝试了几件事之后,我没有在会话中保存对象,而是保存对象的 id,并且在需要对象的任何地方,我都从会话中获取 id:

$this->get('session')->get('empleado_id');

并通过以下方式获取对象:

$em = $this->getDoctrine()->getManager();
$empleado_alta=$em->getRepository('EmpleadosBundle:Empleados')->find($this->get('session')->get('empleado_id'));

有了这个解决方案,一切都很完美。

我认为我问题的第一个动作中的重定向,对会话做一些事情并破坏了它。

感谢所有回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2020-02-09
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多