Bonjour,
Je viens me nourrir de vos avis
A partir du pattern MVC, j'ai implémenté en php (avec Zend), une couche de services et d'accès aux données (DAO, mapping géré par Doctrine) avec injection de dépendances en m'inspirant de JAVA avec Spring MVC et Hibernate. Evidemment je l'ai adapté à un environnement script. Par exemple, l'injection de dépendances est totalement lazy.
Mais ma question ne porte pas sur PHP et bien sur un problème de conception.
J'ai besoin d'ajouter la notion de transaction à mes services. Avec JAVA et l'AOP c'est assez facile et ça passe par des fichiers de configuration, le code venant s'injecter au moment de la compilation. Dans un environnement script c'est moins évident, ce serait trop lourd.
L'avantage de l'AOP est que les services ignorent totalement la présence d'un gestionnaire de transactions.
Comment faire dans mon cas ? Par exemple si dans un controller je dois faire appel à deux méthodes de deux services distincts mais dont le traitement est lié, si le traitement lors de l'appel à la 2ème méthode échoue, je dois rollback ce qui s'était passé dans la 1ère.
Essayons avec un exemple:
J'ai un site contenant des albums photos, j'ai donc deux entités, album et photo. Lorsque je veux ajouter des photos à un album existant, en supposant que j'ai deux services, respectivement photoService et albumService, j'obtiens dans le controlleur quelquechose proche de (grossièrement) :
Sauf que, si le link des photos se passe mal, je dois pouvoir annuler le addPhotos.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //.... validation données POST ok. $photoIds = $this->_photoService->addPhotos($form['photos']); $album = $this->_albumService->findAlbumById($form['album']); $this->_albumService->linkPhotosToAlbum($album, $photoIds);
La seule méthode que je vois serait d'implémenter des méthodes "beginTransaction()", "commitTransaction()" et "rollbackTransaction()" dans mon service générique.
Mais, la présence de DAO n'est pas obligatoire dans les services, qui fonctionnent exactement comme des services en JAVA avec Spring MVC, et avec ce système j'ai besoin d'un DAO générique toujours présent dans les services pour déclencher les transactions.
Cette solution ne répond donc pas à la problématique car elle lie très fortement les services à la couche d'accès aux données (DAO).
Seulement, à part cette solution je sèche
Des idées ?
Merci.
A+ benjamin.
Partager