Les data bags
sont des données de l'application qui sont stockées dans le navigateur, et envoyées à la demande dans les requêtes ajax vers les classes Jaxon.
Elles conviennent aux données qui doivent être disponibles dans l'application, mais ne sont utilisées que par certains composants.
Chaque data bag
possède un identifiant qui doit être unique dans toute l'application, et chacune de ses données est stockée sous une clé qui doit être unique dans le data bag
.
Pour pouvoir lire les données d'un data bag
dans une méthode d'une classe Jaxon, il faut explicitement demander que son contenu soit envoyé dans les requêtes vers cette méthode.
Cela se fait avec des annotations dans la classe, ou à l'enregistrement dans le fichier de configuration, ou avec des appels à la classe Jaxon.
Note sur la sécurité
Les données des data bags
étant stockées dans le navigateur, sont accessibles aux utilisateurs. Il ne faut donc pas y placer des données sensibles.
De même, elles doivent stocker le moins de données possible, car elles augmentent la taille des requêtes Jaxon.
Annotation
L'annotation @databag
est définie sur une classe ou une méthode pour configurer les data bags
.
Elle prend en paramètre son identifiant unique, et peut être repétée pour définir plusieurs data bags
.
Si l'annotation est définie sur une classe Jaxon, alors toutes ses méthodes recevront le contenu du data bag
.
namespace Ns\App;
/**
* @databag bag_key
*/
class FirstClass extends \Jaxon\App\FuncComponent
{
public function doThat()
{
$bagValue = $this->bag('bag_key')->get('value_key');
// ...
}
}
Si l'annotation est définie sur une méthode, celle-ci sera alors la seule à recevoir le contenu du data bag
.
namespace Ns\App;
class SecondClass extends \Jaxon\App\FuncComponent
{
/**
* @databag bag_key
*/
public function doThat()
{
$bagValue = $this->bag('bag_key')->get('value_key');
// ...
}
}
Configuration
Avec les configurations ci-dessous, le data bag
bag_key sera passé dans les requêtes vers toutes les méthodes de la classe \Ns\App\FirstClass
, et dans les requêtes vers la méthode doThat()
de la classe \Ns\App\SecondClass
.
$jaxon->register(Jaxon::CALLABLE_DIR, '/the/class/dir', [
'namespace' => 'Ns',
'classes' => [
\Ns\App\FirstClass::class => [
'functions' => [
'*' => [
'bags' => ["'bag_key'"]
]
]
],
\Ns\App\SecondClass::class => [
'functions' => [
'doThat' => [
'bags' => ["'bag_key'"]
]
]
]
]
]);
'app' => [
'directories' => [
'/the/class/dir' => [
'namespace' => 'Ns',
// 'autoload' => true,
// 'separator' => '.',
// 'protected' => [],
'classes' => [
\Ns\App\FirstClass::class => [
'functions' => [
'*' => [
'bags' => ["'bag_key'"]
]
]
],
\Ns\App\SecondClass::class => [
'functions' => [
'doThat' => [
'bags' => ["'bag_key'"]
]
]
]
]
]
]
]
namespace Ns\App;
class SecondClass extends \Jaxon\App\FuncComponent
{
public function doThat()
{
$bagValue = $this->bag('bag_key')->get('value_key');
// ...
}
}
Accès aux data bags
Toutes les classes de composants de Jaxon possèdent une fonction bag()
qui prend en paramètre un identifiant et renvoie l'objet data bag
correspondant.
L'objet data bag
possède deux fonctions set()
et get()
qui permettent respectivement de définir ou lire une valeur dans le data bag
.
/**
* @databag bag_key
*/
class FirstClass extends \Jaxon\App\FuncComponent
{
public function save()
{
// The value is saved in the browser.
$this->bag('bag_key')->set('value_key', $value);
}
public function read()
{
// The value is sent from the browser to the application.
$value = $this->bag('bag_key')->get('value_key');
}
}