# Utiliser les managers et leurs structures

## Introduction

Ce document présente comment utiliser les managers et leurs structures.

## Les managers

Un manager est une classe qui gère un ensemble d'objets. Il est responsable de la création, de la mise à jour et de la suppression de ces objets. Les managers sont utilisés pour encapsuler la logique métier et faciliter l'accès aux données. Généralement un manager est lié une table de données, par exemple un manager "ContactManager" pour une table "contact". Ce manager va également gérer un petit cache de données afin de récupérer les données plus rapidement si elles ont déjà été chargées avant.

Ce genre de méthodes sont généralement utilisées dans les managers :

- manager->fetch()
  - Récupérer un objet et l'ajouter au cache
- manager->list()
  - Récupérer une liste d'objets et les ajouter au cache
- manager->create()
  - Créer un objet et l'ajouter au cache
- manager->update()
  - Mettre à jour un objet et le mettre à jour dans le cache
- manager->delete()
  - Supprimer un objet et le supprimer du cache

## Les structures

Un manager converti les données récupérées en classes d'objets pour faciliter la manipulation des données. Ces classes d'objets sont appelées "structures". Les structures sont des classes qui contiennent des propriétés et des méthodes pour manipuler les données. Elles sont généralement utilisées pour représenter une ligne de données dans une table. Par exemple, une structure "Contact" peut contenir des propriétés comme "nom", "prénom", "email", etc. et des méthodes pour manipuler ces données.

- structure->id
  - Identifiant de l'objet
- structure->name
- structure->email
- structure->getProjects()
  - Récupérer la liste des projets associés à cet objet (Par exemple)
- structure->update()
  - Mettre à jour l'objet dans la base de données
- structure->delete()

## Exemple

Voici un exemple de manager et de structure pour un objet "Contact".

```php
class ContactStructure extends BaseStructure {
    public $id;
    public $name;
    public $email;

    public function __construct($data) {
        $this->id = $data['id'];
        $this->name = $data['name'];
        $this->email = $data['email'];
    }

    public function getProjects() {
        // Récupérer la liste des projets associés à cet objet
    }
}

class ContactManager extends BaseManager {
    protected $structure = ContactStructure;
}

$contacts = new ContactManager();

$contact = $contacts->fetch(1);

// Update the contact
$contact->update(array(
    '[name]' => 'John Doe',
    '[email]' => 'example@toosmart.fr'
));

// Delete the contact
$contact->delete();

// Create a new contact
$contact = $contacts->create(array(
    '[name]' => 'John Doe',
    'att2' => 'example@toosmart.fr'
));

// List all contacts
$contactsList = $contacts->list();

// List all contacts with a specific filter
$contactsList = $contacts->list('[name] = "John Doe"');
```
    