Bonjour,
Voila je rencontre un petit problème avec mon code ..... et je n'arrive pas à voir comment je peut m'en sortir.
Contexte:
J'ai crée une Application Slim Framework qui me permet de gerer mes comptes utilisateurs Google Apps dans laquelle j'ai une Classe qui représente mon "Helper" pour communiquer avec l' API Google (Google Admin SDK).
L'idée est de créer ce helper (cette classe) comme un Singleton ... car j'ai besoin d'avoir tjrs le meme objet (histoire ne ne pas avoir à refaire l'authenfification OAuth2 ...) afin de n'avoir qu'une seule et meme instance possible afin d'etre sur que c'est toujours le meme objet que j'utilise ...
Pour faire simple ... car de toue façon, le pb reste identique ...pour l'exemple je vais remplacer ma classe "HelperGoogleApps" par une simple classe "SingletonClass" qui utilisera aussi le partern "singleton" et qui à qu'un seul attribut :
M'a problématique est que je n'arrive pas a recupérer le meme objet (alors que c'est un singleton ) depuis 2 routes (url) différentes avec Slim Framework
Code Slim Framework
<?php
require 'Slim/Slim.php';
require 'myclass/SingletonClass.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
$app->singleton = SingletonClass::getInstance();
// GET route
$app->get(
'/singleton',
function () use ($app){
echo "<h3>Primary Objet | app->singleton->getName() </h3>";
echo $app->singleton->getName();
$app->singleton->setName('BAR');
echo "<h3>SetName('BAR')</h3>";
echo "<h3>app->singleton->getName()</h3>";
echo $app->singleton->getName();
echo "<hr>";
$S2 = SingletonClass::getInstance();
echo "<h3>Second Objet | $2->getName()</h3>";
echo $S2->getName();
}
);
$app->get(
'/singletonbis',
function () use ($app){
echo "<h3>app->singleton->getName()</h3>";
echo $app->singleton->getName();
echo "<hr>";
}
);
$app->run();
// CODE SingletonCalass.php
class SingletonClass {
private $name = null;
private static $_instance;
private function __construct() {
$this->name = 'FOO';
}
/**
* Récupère l'instance de la classe
*
* @return SingletonClass
*/
public static function getInstance()
{
if( true === is_null( self::$_instance ) )
{
echo "getInstance SINGLETON NEW Instance<br>";
self::$_instance = new self();
}
return self::$_instance;
}
public function setName($string){
$this->name = $string;
}
public function getName(){
return $this->name;
}
}
```i
### Ce que je fais / J'obtiens
Le resulat lorsque j'execute
http://slim2.local/singleton
getInstance SINGLETON NEW Instance
Primary Objet | app->singleton->getName()
FOO
SetName('BAR')
app->singleton->getName()
BAR
Second Objet | $2->getName()
BAR
Le resulat lorsque j'execute
http://slim2.local/singletonbis
getInstance SINGLETON NEW Instance
app->singleton->getName()
FOO
### Ce que je veux
Du coup on voit bien que le signeton marche bien ... mais uniquement lorsque l'on ai sur la meme route (http://slim2.local/singleton)
Lorsque que je vais sur http://slim2.local/singletonbis, il me genere un nouvel objet "SingletonClass"
ce que j'aimerais c'est que quand je vais sur http://slim2.local/singletonbis,
http://slim2.local/singletonbis
getInstance SINGLETON NEW Instance
app->singleton->getName()
BAR
## Pb conception/structuration
En fait , je constate que c'est pas que ça fonctionne pas .. mais c'est simplement que ca fonctionne pas comme je voudrais ...
Du coup, je me dit que c'est peut etre moi qui utilise mal les "concepts" notament le patern "singleton" C'est peut etre un autre aptern qui faut utiliser dans ca cas là ... :-(
Je me reponds a moi meme ...
Bon en fait c'est bien ce que je pensais .....
Le patern "singleton" ne sert pas a grand choses dans mon cas ....
Le mieux est plutot de stocker l'objet, directement dans la $_SESSION ...