【发布时间】: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
)
)
)
我不明白为什么在第一个动作中对象的打印是正确的,但在第二个动作中却显示了不完整的类名
【问题讨论】:
-
stackoverflow.com/questions/2010427/… Symfony 将在你的控制器被实例化之前开始一个会话