2017-09-13 71 views
0

會話我有這樣的控制器:的Symfony 2.4在控制器

<?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函數結束時,我重定向到其他動作,在同一個控制器:

返回$這 - >重定向($這 - > 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($這個 - >獲得( '會話' ) - >獲取( '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 -

我tryed解決方案史蒂夫和它isn't工作,返回了同樣的錯誤:

我刪除了線的session_start(),和removin這條線就像會議沒有開始。

我會盡量解釋一步的處理步驟是否I'm缺少的東西:

我呼籲在loginAction在Empleados控制器,並與清除會話:

$此 - >獲得( '會議') - >清除();

然後我渲染登錄表單

2-視圖當我提交登錄表單我打電話conexionAction在Empleados控制器,在這裏,我查了一些參數,如果一切OK我保存的對象(會話) - > set('empleado',serialize($ o_empleado));或$ this-> get('session') - > set('empleado',$ o_empleado);

*注意:如果我在這裏打印$ this-> get('session'),我會完美地看到對象。

和保存對象後,我重定向到在同一個控制器的另一個行動:

回報$這個 - >重定向($這個 - > generateUrl( 'menu_principal'));

以前的重定向我在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 
      ) 

    ) 

) 

我不understant爲什麼在第一次行動的對象的印刷是正確的,但在第二個它說,不完整的類名

+0

https://stackoverflow.com/questions/2010427/php-php-incomplete-class-object-with-my-session-data Symfony將在你的控制器實例化之前開始一個會話 – Steve

回答

0

Smfony幾乎可以肯定地啓動一個會話之前,你的控制器在實例化,因此之前在empledos類加載。

可以通過顯式處理系列化解決這個問題:

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

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

好吧,我會給它一個嘗試,所以我需要刪除session_start();行或它是需要的??因爲你說過:「Symfony幾乎肯定是在你的控制器實例化之前開始一個會話」 – SensacionRC

+0

是的,你應該刪除該行。 – Steve

0

最後,嘗試幾件事情,而不是保存在會話對象後,我保存對象的ID,到處都我需要對象,給我的ID從會話:

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

,並通過獲得OBJET:

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

使用此解決方案,所有工作都完美無缺。

我認爲,在我的問題中的第一個行動中的重定向,對會話做了些什麼,並打破了它。

感謝您的所有回覆。