2   Le Repository

2.1   Au sujet du Repository

Le Repository va faire le lien entre votre objet entité et votre base de données, par l’intermédiaire de l’objet Query.

Il est aussi responsable d’initialiser les Metadata qui concernent votre entité afin de savoir comment mapper votre objet en base de données.

2.2   Création des Metadata

Comme un exemple est plus parlant qu’un long discours :

public static function initMetadata(SerializerFactoryInterface $serializerFactory, array $options = [])
{
    $metadata = new Metadata($serializerFactory);

    $metadata->setEntity('sample\src\model\City');
    $metadata->setConnectionName('main');
    $metadata->setDatabase('world');
    $metadata->setTable('t_city_cit');

    $metadata->addField(array(
        'primary'       => true,
        'autoincrement' => true,
        'fieldName'     => 'id',
        'columnName'    => 'cit_id',
        'type'          => 'int'
    ));

    $metadata->addField(array(
        'fieldName'  => 'name',
        'columnName' => 'cit_name',
        'type'       => 'string'
    ));
Quelques précisions :
  • fieldName correspond au nom de la propriété de votre entité
  • columnName correspond au nom de la colonne dans votre base de données
  • type correspond au type de votre variable avec comme valeurs possibles :
    • int
    • string
    • bool
    • datetime
    • json

Le type bool, datetime et json sont un peu particuliers, car il s’agit de types considérés complexes et qui acceptent donc d’être sérializés/désérializés via des options :

addField([
    'fieldName'          => 'tags',
    'columnName'         => 'tags_name',
    'type'               => 'json',
    'serializer_options' => [
        'unserialize' => ['assoc' => true]
    ]
]);

Je vous invite à regarder le code source de chaque Serializer pour voir les configurations possibles.

Vous pouvez injecter votre propre serializer :

addField([
    'fieldName'  => 'tags',
    'columnName' => 'tags_name',
    'type'       => 'json',
    'serializer' => '\Bouh\Awesome\Serializer'
]);
Le type bool est considéré comme un type complexe, car la façon de le stocker en base est différent selon chaque sgbd :
  • CCMBenchmark\Ting\Driver\Pgsql\Serializer\Bool
  • CCMBenchmark\Ting\Driver\Mysqli\Serializer\Bool

2.3   Requêtes

Le Repository fournit plusieurs méthodes afin de faciliter les requêtes simples.

2.3.1   Trouver un objet par clé primaire

$repository->get(['id' => 3])

2.3.2   Tous les objets

$repository->getAll()

2.3.3   Un objet d’après une ou plusieurs propriété(s) du modèle

$repository->getOneBy(['propertyName' => 'Sylvain']);

2.3.4   Une collection d’objet d’après une ou plusieurs propriété(s) du modèle

$repository->getBy(['propertyName' => 'Sylvain']);