我有这个控制器:
<?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($这 - &GT;获得( '会话') - &GT;获得( '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函数结束时,我在同一个控制器中重定向到其他动作:
返回$ this-&gt;重定向($ this-&gt; 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($这 - &GT;获得( '会话') - &GT;获得( '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,并使用以下命令清除会话:
$这 - &GT;获得( '会话') - &GT;清除();
然后我使用登录表单
呈现视图2 - 当我提交登录表单时,我在Empleados Controller中调用conexionAction,在这里我检查一些参数,如果一切正常,我会在会话中保存和类empleado的对象:
$这 - &GT;获得( '会话') - &gt;设置( 'empleado',序列化($ o_empleado));或$ this-&gt; get('session') - &gt; set('empleado',$ o_empleado);
*注意:如果我在这里打印$ this-&gt; get('session'),我会完美地看到该对象。
保存对象后,我重定向到同一个控制器中的另一个动作:
返回$ this-&gt;重定向($ this-&gt; generateUrl('menu_principal'));
3 - 使用之前的重定向,我在Empleados Controller中调用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
)
)
)
我不明白为什么在第一个动作中对象的打印是正确的,但在第二个动作中它表示不完整的类名
答案 0 :(得分:0)
Smfony几乎肯定会在实例化控制器之前启动一个会话,因此在加载empledos
类之前。
您可以通过明确处理序列化来解决这个问题:
//set
$this->get('session')->set('empleado', serialize($o_empleado));
//get
$empleado_conectado=unserialize($this->get('session')->get('empleado'));
答案 1 :(得分:0)
最后,在尝试了几件事之后,我没有在会话中保存对象,而是保存了对象的id,在我需要该对象的任何地方,我从会话中获取了id:
//Your own personal doSomething
fun doSomething(varargs: param: Pair<String, JSONItem>) {
//Call the real doSomething()
doSomething(param.map { Pair(it.first, it.second.item) }}
}
doSomething(
"key1" to false.asJSONItem(),
"key2" to "value2".asJSONItem(),
"key3" to 86.asJSONItem()
)
通过以下方式获取对象:
$this->get('session')->get('empleado_id');
有了这个解决方案,一切都很完美。
我认为在我的问题的第一个动作中重定向,对会话做了一些事情并打破了它。
感谢所有回复。