Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

<? 

App::uses('CakeEvent', 'Event');
App::uses('DatabaseSession', 'Model/Datasource/Session');

class CompositSession extends DatabaseSession implements CakeSessionHandlerInterface {
    public $cacheKey;

       // écrit les données dans la session.
    public function write($id, $data) {
        Cache::write($id, $data, $this->cacheKey);

        $event = new CakeEvent('CompositSession.write', $this);
        $this->getEventManager()->dispatch($event);

        return parent::write($id, $data);
    }
}

Ce que je veux

Enclencher un événement à chaque fois qu'une session est écrite.

Ce que j'obtiens

Fatal error: Call to a member function getEventManager() on a non-object in app\Model\Datasource\Session\CompositSession.php

Merci à vous,

6 réponses


Personne pour m'aider ?

Le probléme ne vient pas de là, c'est pas un soucis tu peu l'écrire <? (short_open_tag ) ou ainsi <?php
Mais je te l'accorde, PHP conseil de l'ouvrir ainsi <?php ?>

Le soucis vient du faite que nativement DatabaseSession ne prend pas en charge cakeEvent.
Mais j'ai beau charger cakeEvent dans DatabaseSession, CakeSessionHandlerInterface ne parvient pas à gérer mes événements.
Je sais pas ou charger cakeEvent pour que ça soit le cas.

Y'a pas un expert en cakePHP qui peu se pencher sur la question je désespére.

J'ai fait la mofication, mais cela n'a rien changé.
Merci à toi,

Cest une classe personnalisé pour gérer chaque nouvelle session et enregistrer dans la mémoire cache et dans la base de donnée.
Elle est gérer directement par le framework. Ma classe CompositSession fonctionne parfaitement, c'est juste le dispatch de l'événement qui pose probléme.

Bonjour.
Est-ce que tu as regardé dans la documentation de CakePHP ?
Car si tu suis l'exemple donnée sur la documentation, tu devrais pour commencer, avoir la fonction __construct.
Ensuite, si tu regardes bien dans la documentation, il y est dit que le gestionnaire d'Event est disponible dans les modèles, tu dois donc correctement utiliser la fonctionnalité, surtout que tu veux utiliser cette fonctionnalité, mais tu ne nous montre pas les autres codes correspondant à l'event.
Je te recommande donc de bien lire la documentation à ce propos.

Bonjour Lartak,

J'ai raccourcis déliberament le code pour pas surcharger le post, je te l'accorde sa porte à confusion.
Je fais ça, car je sais que mon CakeSessionHandlerInterface et la gestion de mes événements ne posent pas probléme.

Le soucis vient juste du fait que j'essaie de dispatcher mon événement depuis CakeSessionHandlerInterface.
Ma classe hérite de DatabaseSession, qui elle ne gére pas nativement les événements comme les modélels et les controlleurs.
Mais cela reste possible et cela m'a été confirmé par de Mark Story qui gére le dépot Github de CakePHP.
Reste à savoir comment prendre en charge les événements.

Et voici mon code au complet, comme tu l'aurais souhaité.

<?php

App::uses('DatabaseSession', 'Model/Datasource/Session');
App::uses('CakeEventListener', 'Event');

class CompositSession extends DatabaseSession implements CakeSessionHandlerInterface {
    public $cacheKey;

    public function __construct() {
        $this->cacheKey = Configure::read('Session.handler.cache');
        parent::__construct();
    }

    // Lit les données à partir d'une session.
    public function read($id) {
        $result = Cache::read($id, $this->cacheKey);
        if ($result) {
            return $result;
        }
        return parent::read($id);
    }

    // écrit les données dans la session.
    public function write($id, $data) {
        Cache::write($id, $data, $this->cacheKey);  
        $eventListner = new CakeEvent('CompositSession.Write', $this);  
        $this->getEventManager()->dispatch($eventListner);
        return parent::write($id, $data);
    }

    //     détruit une session.
    public function destroy($id) {
        Cache::delete($id, $this->cacheKey);
        return parent::destroy($id);
    }

    // retire les sessions expirées.
    public function gc($expires = null) {
        Cache::gc($this->cacheKey);
        return parent::gc($expires);
    }
}

?>

Merci à toi,