控制器

时间:2017-09-13 17:55:03

标签: php symfony

我有这个控制器:

<?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
            )

    )

)

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

2 个答案:

答案 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');

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

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

感谢所有回复。