Session

Pour mettre une valeur en session quelle est la différence entre :

$_SESSION[‘MenuUtilisateur’]=$menuutilisateur;

et

Yii::app()->session[‘MenuUtilisateur’]=$menuutilisateur;

La différence est que l’un de variables $ _SESSION utilisent session PHP pur peut donc entrer ces variables dans un fichier PHP qui ne fait pas partie de YII. En Yu de l’app () -> variables de session que vous utilisez la session YII qui a un hachage commence là où identifiaca.

exemple

1 : $_SESSION

2 : Yii::app()->session




log::trace($_SESSION);

[12:26:55.891][trace][vardump] array

(

    '1' => '1'

    '893edc365fb68ff38fa8daf92fb0f948__2' => '2'

)



translate.google

Merci et maintenant en terme d’optimisation quel est le meilleur ?

Pourquoi deux fonctions certes y’a une différence en quoi l’utilisation de l’un est meilleure que l’autre ? ou bien c’est la même chose ?

Salut,

Sans être totalement un expert, je dirais que les deux utilisations mènent au même résultat, même si le “Yii::app()->session” pourrait apporter plus de sécurité, vu qu’on utilise le framework.

Toujours est il que si tu utilises Yii, utilises toutes les fonctionnalités, elles ne sont pas là au hasard ^^

Si tu veux plus d’info tu peux jeter un rapide coup d’oeil ici : www.larryullman.com/2011/05/03/using-sessions-with-the-yii-framework

En espérant avoir été utile !

Edit : petit soucis d’url

Merci je suis allé voir le site. Il est bon et claire. OK

Ma réponse est «ça dépend» si la variable de session est utilisé dans le YII solamante utiliser le "Yii::app()->session», mais si vous avez besoin de cette variable dans un fichier PHP en dehors de Yu vous utilisez le "$_SESSION"

Saludos.

Ok

Je suis du même avis que les autres, il vaut mieux utiliser Yii::app()->session.

Mais parfois avec cette solution tu peux avoir des problèmes, notamment avec les tableaux multidimensionnels :


Yii::app()->session['index1']['index2'] = 'something' 

te retournera une erreur, et tu seras obligé de faire :




$session['index2'] = 'something';

Yii::app()->session['index1'] = $session;



ok finalement c’est cette solution que j’ai pris. Par contre j’utilise des tableaux multidimentionnels mais pour le moment j’ai pas encore de problème. Je construis d’abord mon tableau et je le mets en session du genre


				        $menuutilisateur=array_merge($menuutilisateur,array(

								$tab[$i][1]=>array( 'label'			=>$tab[$i][0], 

									               	'url' 		  	=>array($tab[$i][1]),

												    'idcste'		=>array($tab[$i][2]), 

												    'idmenu'		=>array($tab[$i][3]),

												    'labelsousmenu'	=>array($tab[$i][4]), 

												   'visible'=>!Yii::app()->user->isGuest

									               )

							)); 


	    if(isset(Yii::app()->session['MenuUtilisateur']) and $connexion==0){// L'utilisateur est déja connecté et son profil est en session

	    	$menuutilisateur=Yii::app()->session['MenuUtilisateur']; // Recupérer le profil de l'utilisateur en session

	    		    } else {

		    	    $menuutilisateur=array_merge($menuutilisateur,array( // Ajourter le Menu plublic 2ième partie

						'/site/login' =>array('label'=>'Se connecter', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),

						'/site/logout'=>array('label'=>'Se déconnecter ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)

					));	    	

	    	if($connexion==0){ // Mettre en session le profil de l'utilisateur

		    	    Yii::app()->session['MenuUtilisateur']=$menuutilisateur;	

		    	     

	    	    }

	    }



et pour recupérer une valeur je fais :




idcste=Yii::app()->session['MenuUtilisateur'][$paramscste['controlleractiontable'].$paramscste['valeurparamurltable'].Yii::app()->session['parammenutable']]['idcste'][0];



en tout cela à l’air de marcher.

à la lecture du code de CHttpSession.php, on voit bien les avantages à utiliser la classe de YII.

Par exemple :

De manière générale, quand on créé une appli web, on créé une classe Session, pour déterminer ce qui se passe à l’ouverture, à la fermeture, pour gérer les erreurs…

C’est ce que les développeurs de YII vous invitent à faire vous proposant d’étendre la classe.

Même sans recourir aux fonction de YII, pour coder proprement, on est obligé de créer une classe session. Par exemple pour détruire la clé d’une session, on ne doit pas faire directement unset($_SESSION[$key]). En effet, si $_SESSION[$key] n’existe pas, cela renvoie un NOTICE Php. Donc il faut bien faire une vérification sur l’existence de $_SESSION[$key] avant. C’est précisément ce que fait la méthode remove :


	/**

	 * Removes a session variable.

	 * @param mixed $key the name of the session variable to be removed

	 * @return mixed the removed value, null if no such session variable.

	 */

	public function remove($key)

	{

		if(isset($_SESSION[$key]))

		{

			$value=$_SESSION[$key];

			unset($_SESSION[$key]);

			return $value;

		}

		else

			return null;

	}

De plus, les erreurs seront logguées dans yii. Par exemple, dans la méthode open, on trouve :


Yii::log($message, CLogger::LEVEL_WARNING, 'system.web.CHttpSession');

Et elles sont renvoyées via CException. Par exemple, dans la méthode setSavePath :


throw new CException(Yii::t('yii','CHttpSession.savePath "{path}" is not a valid directory.',

				array('{path}'=>$value)));

En fait, de manière générale, utiliser les fonctions d’un Framework plutôt que de faire tout soi-même permet d’avoir un code plus propre, plus optimisé, plus sécurisé.