My Simple OLM
Présentation
OLM signifie Object Ldap Mapping
msolm est un générateur de classes php sur le même principe que msorm, mais pour des bases ldap
À partir d'un fichier xml qui décrit un ou plusieurs type d'entrées ldap, msolm génère un ensemble de classe php qui représentent ces entrées. Ce modèle objet php peut être copié dans un projet et est utilisable tel quel, sans qu'aucun autre outil ne soit necessaire.
Attention
Les classes générées par msolm utilisent la classe MLdap de mlib (mlib\net\ldap\MLdap).
Le modèle généré peut être augmenté avec des méthodes supplémentaires que l'on peut écrire.
L'utlisation du modèle est très facile et rend le code des applications très lisible
msolm est organisé comme suit :
msolm/
├── msolm.php
├── generators/
│ ...
│ ...
└── projects/
├── myproject_1/
│ └── description.xml
└── myproject_2/
└── description.xml
Pour un projet donné, on doit donc créer un fichier description.xml (voir ici) et lancer en ligne de commande (le fichier msolm.php soit avoir les droits d'exécution):
$ ./msolm.php -g -p myproject
Cette commande est la plus basique. Elle va prendre le fichier description.xml qui se trouve dans le sous-dossier myproject/ du dossier projects/, et créer au même niveau, un dossier model/ qui contient l'ensemble des fichiers php générés.
Il existe plusieurs options. Notamment :
- -g (ou --generate)
- -o (ou --output) : permet de spécifier un autre dossier de destination que le sous-dossier
model/ - -u (ou --update) : permet de ne pas écraser le code additionnel qui aurait été écrit
- -h (ou -? ou --help) : affiche une aide qui résume toutes les options
Un exemple
Le fichier description.xml
Exemple :
<?xml version="1.0" encoding="UTF-8"?>
<ldap host="ldap.my-corp.org" port="389" bind_dn="cn=manager,dc=my-corp,dc=org" bind_password="" phpNamespace="ldapsample">
<object ou="ou=people,dc=my-corp,dc=org" filter="" phpObjectName="Person">
<attribute name="uid" rdn="true" phpAttributeName="login" />
<attribute name="sn" phpAttributeName="name" />
<attribute name="givenName" phpAttributeName="firstname" />
<attribute name="displayName" />
<attribute name="mail" />
<attribute name="otherMails" multi="true" phpAttributeName="mailAlias" phpAttributePFName="mailAliases"/>
</object>
</ldap>
Ce qui est généré
model/
└── ldapsample
├── Person.php
├── PersonManager.php
├── core
│ ├── LdapConnectionProvider.php
│ ├── MSOLM.php
│ ├── Person.conf.php
│ ├── PersonCore.php
│ ├── PersonManagerCore.php
│ └── __ldap_params.conf.php
└── exceptions
├── LdapConnectionProviderException.php
├── PersonException.php
└── PersonManagerException.php
- Chaque "object" défini dans le fichier xml donne deux classes
- Pour chaque object, on définit l'attribut
phpObjectNamequi sera le nom de la classe- on peut aussi définir l'attribut
phpObjectPFNamesi le pluriel n'est pas formé en ajoutant simplement un "s". 'PF' est pour 'plural form'. Cette forme est utilisée pour générer le nom du manager.
- on peut aussi définir l'attribut
- Pour chaque attribut, on peut définir un
phpAttributeName(et événtuellement unphpAttributePFNamesi multi-valué) si on veut que l'attribut de la classe php soit nommé différement de l'attribut ldap. Cela permet une meilleure abstraction.
Important
Dans le dossier core/, on voit qu'en plus des deux classes ObjectCore et ObjectManagerCore, il existe un trosième fichier Object.conf.php
Ce fichier fichier définit le mapping des noms d'attributs.
Par défaut il contient ce qui est indiqué dans le fichier xml.
Mais dans le développement d'appications interfacées avec un annuaire ldap, la plupart du temps on utlilise un annuaire existant, pour lequel on a pas choisi les schemas et le nom des attributs (contrairement aux bases de données où la conception de la base fait partie du développement de l'application). C'est pourquoi on offre ici la possibilité de modifier ces noms d'attributs dans un fichier de configuration séparé. Certains attributs peuvent même être laisssés vide si l'annuaire ne dispose pas de l'information
Exemple
<?php
$ldap_base = "ou=people,dc=univ-perp,dc=fr";
$ldap_filter = "";
$ldap_attributes_mapping = array(
"login" => "uid",
"name" => "sn",
"firstname" => "givenName",
"displayName" => "displayName",
"mail" => "mail",
"mailAliases" => "otherMails");
?>
Comment s'utilise ce modèle ?
Le principe est toujours le même, mais les classes générées contiennent un code et des attributs qui dépendent vraiment du fichier xml de définition.
Exemple :
$persons_manager = ldapsample\PersonsManager::getInstance();
$person = $persons_manager->get('aPersonLogin'));
echo $person->getLogin()." : "$person->getDisplayName().PHP_EOL;
echo " ".$person->getMail().PHP_EOL;
foreach($person->getMailAliases() as $mailAlias){
echo " ".$mailAlias.PHP_EOL;
}
$person->addMailAlias('ceo@mycorp.org');
$persons_manager->update($person);
Dans l'exemple ci-dessus on voit que pour chaque "objet" défini en xml, on a deux classes php : une classe "Object" et une classe "ObjectsManager".
- La première représente des objets avec leurs attributs (avec leurs getteurs et setteurs)
- La deuxième est une classe qui permet de gérer ces objets : obtenir un ou plusieurs objets, en vérifier l'existence, en ajouter, en supprimer ou les mettre à jour.
Ces deux classes héritent de leurs équivalents "core" qui contiennent tous les attributs et méthodes fournies par défaut.
Ces deux classes peuvent donc tout à fait être enrichies d'autres attributs ou méthodes qui vous manqueraient.
À la différence de msorm, msolm ne gère pas les relations qui pourraient exister entre les objets (valeurs d'un attributs d'un objet Person et appartenance à un autre objet Group par exemple).