Source de données : File


1Présentation

Temma peut utiliser une arborescence de fichiers comme une source de données. Cela peut être utile pour mettre rapidement en place une solution de stockage, qui pourra être éventuellement remplacée par la suite par une base de données relationnelle, une base de données non relationnelle, ou un stockage de fichiers externalisé.

Si vous avez correctement configuré les paramètres de connexion, Temma crée automatiquement un objet de type \Temma\Datasources\File. Par convention, nous partirons du principe que vous avez nommé cette connexion file dans le fichier etc/temma.php (voir la documentation de la configuration).

La connexion est alors disponible dans le contrôleur en écrivant :

$this->file

Dans les autres objets gérés par le composant d'injection de dépendances, la connexion à la base de données est accessible en écrivant :

$loader->dataSources['file']

2Configuration

Dans le fichier etc/temma.php (voir la documentation de la configuration), vous déclarez le DSN (Data Source Name) qui permet de définir l'arborescence à utiliser.

Le DSN permettant d'utiliser une arborescence de fichiers s'écrit de la forme : file://[UMASK]CHEMIN
Le umask est optionnel et s'écrit sous forme octale en commençant par un zéro. S'il n'est pas défini, c'est le umask par défaut du système qui est utilisé.

Exemples :

  • file:///var/data/tema
  • file://0777/var/data/temma

3Appels unifiés

3.1Accès de type tableau

// vérification de l'existence d'une donnée
if (isset($this->file['path/key1']))
    doSomething();

// lecture de données (désérialisées)
$data = $this->file['path/key1'];

// écriture de données (sérialisées)
$this->file['path/key1'] = $value;

// effacement d'un fichier
unset($this->file['path/key1']);

// nombre de fichiers
$nbr = count($this->file);

3.2Méthodes générales

// vérification de l'existence d'une donnée
if ($this->file->isSet('user/1'))
    doSomething();

// effacement de donnée
$this->file->remove('user/1');

// effacement de plusieurs données
$this->file->mRemove(['user/1', 'user/2', 'user/3']);

// effacement de données à patir d'un masque
$this->file->clear('user/*');

// effacement de toutes les données
$this->file->flush();

3.3Gestion de données complexes sérialisées

// recherche de fichiers correspondant à un masque
$users = $this->file->search('user/*');

// recherche de clés à partir d'un masque,
// avec récupération des données (désérialisées)
$users = $this->file->search('user/*', true);

// lecture de données (désérialisées)
$user = $this->file->get('user/1');
// lecture de données avec valeur par défaut
$color = $this->file->get('color', 'blue');
// lecture de données avec création de données si nécessaire
$user = $this->file->get("user/$userId", function() use ($userId) {
    return $this->dao->get($userId);
});

// lecture de plusieurs données (désérialisées)
$users = $this->file->mGet(['user/1', 'user/2', 'user/3']);

// écriture de données (sérialisées)
$this->file->set('user/1', $userData);
// écriture de données (sérialisées) avec des droits d'accès spécifiques
$this->file->set('user:1', $userData, 0600);

// écriture de plusieurs données (sérialisées)
$this->file->mSet([
    'user/1' => $user1data,
    'user/2' => $user2data,
    'user/3' => $user3data,
]);
// écriture de plusieurs données, avec des droits d'accès spécifiques
$this->file->mSet([
    'user/1' => $user1data,
    'user/2' => $user2data,
], 0750);

3.4Gestion de données brutes

// lecture de données (brutes)
$html = $this->file->read('page/home');
// lecture de données avec valeur par défaut
$html = $this->file->read('page/home',
                          '<html><body><h1>Homepage</h1><body><html>');
// lecture de données avec création de données si nécessaire
$html = $this->file->read('page/home', function() {
    return file_get_contents('/path/to/homepage.html');
});

// lecture de plusieurs données (brutes)
$pages = $this->file->mRead(['page/home', 'page/admin', 'page/products']);

// copie d'une donnée dans un fichier local
$this->file->copyFrom('page/home', '/path/to/newpage.html');
// copie d'une donnée dans un fichier local, avec valeur par défaut
$this->file->copyFrom('page/home', '/path/to/newpage.html', $defaultHtml);
// copie d'une donnée dans un fichier local,
// avec création de données si nécessaire
$this->file->copyFrom('page/home', '/path/to/newpage.html', function() {
    return file_get_contents('/path/to/oldpage.html');
});
// copie d'une donnée dans un fichier local,
// avec création de données si nécessaire (avec une durée de vie d'une heure)
$this->file->copyFrom('page/home', '/path/to/newpage.html', function() {
    return file_get_contents('/path/to/oldpage.html');
}, 3600);

// écriture de donnée (brute)
$this->file->write('color/blue', '#0000ff');
// écriture de donnée (brute) avec des droits d'accès spécifiques
$this->file->write('color/blue', '#0000ff', 0660);

// écriture de plusieurs données (brutes)
$this->file->mWrite({
    'color/blue'  => '#0000ff',
    'color/red'   => '#ff0000',
    'color/green' => '#00ff00',
]);
// écriture de plusieurs données avec des droits d'accès spécifiques
$this->file->mWrite({
    'color/blue'  => '#0000ff',
    'color/red'   => '#ff0000',
], 0600);

// écriture d'une donnée (brute) à partir d'un fichier local
$this->file->copyTo('page/home', '/path/to/homepage.html');
// écriture d'une donnée à partir d'un fichier local, avec des droits d'accès spécifiques
$this->file->copyTo('page/home', '/path/to/homepage.html', 0600);

// écriture de plusieurs données (brutes) à partir de fichiers locaux
$this->file->mCopyTo([
    'page/home'     => '/path/to/homepage.html',
    'page/admin'    => '/path/to/admin.html',
    'page/products' => '/path/to/products.html',
]);
// écriture de plusieurs données à partir de fichiers locaux
// avec une durée de vie d'une heure
$this->file->mCopyTo([
    'page/home'  => '/path/to/homepage.html',
    'page/admin' => '/path/to/admin.html',
], 3600);