Introduction
CopixServices est la classe de base pour l'implémentation des services sous Copix.
Lorsque vous utilisez un service, vous êtes assurés que tout s'exécute dans un contexte transactionnel (et donc que votre base n'est modifiée que si les opérations sont réussies).
Exemple d'utilisation
try { //demande de publication de la nouvelle d'identifiant 4 $results = CopixServices::process ('module|News::publish', array ('id_news'=>4)); }catch (exception $e){ //CopixServices aura fait un rollback pour nous car l'opération a échouée. //Il ne nous reste plus qu'a indiquer à l'utilisateur que ce n'est pas possible. }
Exemple d'implémentation d'un service
Dans le fichier cheminModuleNews/news/classes/news.services.php
class ServicesNews extends CopixServices { private function publish (){ //On trace dans la table d'historique les modifications $recordHistorique = CopixDAOFactory::createRecord ('NewsHistorique'); $daoHistorique = CopixDAOFactory::create ('DaoHistorique'); $recordHistorique->date_hist = date ('Ymd'); $daoHistorique->insert ($recordHistorique); $daoNews = CopixDAOFactory::create ('News'); if (($newsRecord = $daoNews->get ()) !== null){ $newsRecord->status_news = NEWS::Published (); $daoNews->update ($newsRecord); }else{ throw new ApplicationException ("La nouvelle à publier n'existe pas"); } } }
Dans cet exemple, si nous arrivons dans le cas ou la nouvelle n'existe pas (on lance l'exception), Copix annule pour vous les insertions qui ont déjà été réalisées via le $daoHistorique.
En bref, si jamais une exception est levée par votre service, toutes les modifications en cours sur les bases sont annulées automatiquement !
Paramétrage de la gestion transactionnelle
Au moment de l'appel, vous pouvez spécifier la façon dont vous voulez que CopixServices gère la transaction
- CopixServices::NEW_TRANSACTION - Réalise un begin avant de démarrer le service, rollback en cas de problème sinon commit. (C'est le mode par défaut si vous ne spécifiez rien)
- CopixServices::CURRENT_TRANSACTION - Intègre les requêtes dans la transaction courante sans faire appel a begin / commit. Si aucune transaction n'est active, alors le mode est "auto commit" à chaque requête effectuée dans la base.
Exemple
CopixServices::process ('SomeService::someMethod', array ('param'=>$param), CopixServices::NEW_TRANSACTION);
