Bonjour,

Voila je rencontre un petit problème avec mes sessions.

D'un côté, j'ai une class Session. Le constructeur stocke toutes les sessions dans une variable, et de cette variable, je filtre celles dont le nom commence par "flashbag_".

D'un autre côté, j'ai la validation de mon formulaire requiérant la valeur de cette session flashbag.

Le constructeur de Session :

public function __construct(Dic $dic){
        if(empty($this->session) && empty($this->flashbag) && $dic->env != 'console' && !empty($_SESSION)){
            $this->session = $_SESSION;

            foreach(array_keys($this->session) as $sess){
                if(substr($sess, 0, 9) == 'flashbag_'){
                    $this->flashbag[ $sess ] = $this->session[ $sess ];
                    unset($_SESSION[ $sess ]);
                }
            }
        }
}

Et le code de la vérification du token :

return ($this->dic->load('session')->flashbag($name) == $csrf) ? true : false;

La méthode flashbag retournant dans ce cas $this->flashbag['token'].

Mon problème est que csrf() me renvoie false si je ne mets pas dans le constructeur de Session, avant au moins la condition dans le foreach :

echo '<pre>'; print_r($_SESSION); echo '</pre>';

Si je mets cette ligne, le unset($_SESSION[ $sess ]) fonctionne.

Sauriez-vous d'où peut provenir ce bug ? Je ne comprends pas pourquoi ça me fait ça.

Merci :)

2 réponses


Alix_Speroza
Auteur
Réponse acceptée

Merci pour ta réponse.
Malheureusement, $_SESSION[ $sess ] = null; a le même comportement.

Et il me suffit de mettre var_dump('test'); ou echo 'test'; après $this->session = $_SESSION; pour que ça fonctionne.

EDIT : J'ai un test qui fonctionne.
Je déplace le unset dans la méthode flashbag() :

public function flashbag(string $name, $value = ''){
        if($value == ''){
            if(array_key_exists('flashbag_'.$name, $this->flashbag)){
                unset($_SESSION['flashbag_'.$name]);
                return $this->flashbag['flashbag_'.$name];
            } else {
                return false;
            }
        } else {
            $this->flashbag['flashbag_'.$name] = $value;
            $_SESSION['flashbag_'.$name] = $value;

            return $value;
        }
}

Solution de fortune ^^

J'esaye de trouver ton problème mais il est ma foi fort étrange. En quoi ajouter un print_r pourrait affecter la destruction de la variable ? Je n'ai jamais vu ça. As tu essayé avec d'autres méthodes ? Le bug se reproduit-il ? Je ne peut que te conseiller d'user et d'abuser de var_dump afin d'essayer de comprendre ce qu'il ce passe.
Même si je ne suis capable à l'heure actuelle de résoudre ton bug, je peut te proposer un fix qui certes est moins propre pour la mémoire qu'un unset (cette différence est pour moi négligable dans 99% des cas) mais qui est tout à fait fonctionel :

public function __construct(Dic $dic){
    if(empty($this->session) && empty($this->flashbag) && $dic->env != 'console' && !empty($_SESSION)){
            $this->session = $_SESSION;
            foreach(array_keys($this->session) as $sess){
                if(substr($sess, 0, 9) == 'flashbag_'){
                    $this->flashbag[ $sess ] = $this->session[ $sess ];
                    $_SESSION[ $sess ] = null;
                }
            }
    }
}

Après si tu tiens à conserver ta méthode actuelle je pense que le resultat des var_dump pourrais nous aguiller. Si bien sur quelqu'un n'a pas trouvé la solution entre temps.