Software Craftmanship

Sommaire

- Introduction
- Présentation dans le builder
- Exemple d'un module utilisant l'architecture hexagonale
- L'impact sur la couche model

Module utlisant l'architecture hexagonale

La notion d'architecure hexagonale, concrètement à quoi ça ressemble ?



L'idée est simple: tout ce qui est extérieur à l'algorythme doit etre paramétrable.
Ceci inclu, comme vous pouvez le voir sur le schéma aussi bien la base de données que le système de fichier (lecture/écriture fichiers..), en passant par le contexte du serveur (date)

Concrètement on a, sur ce template, un nouveau type de classe: les classes "business"

Ces classes doivent contenir l'intelligence métier de votre application.
Celles-ci prennent dans leur constructeur l'ensemble de ces paramètres contextuels.

Par exemple pour une classe business de CRUD:

  
<?php

class business_crudUsers extends business_abstract {

   protected $_oModel;
   protected $_oAuth;
   protected $_oI18n;
   protected $_oValid;
   protected $_tColumn = array('login','password','groups_id',);

   public function __construct(interface_model $oModel_interface_i18n $oI18n_interface_valid $oValid_) {
       $this->_oModel $oModel_;
       $this->_oI18n=$oI18n_;
       $this->_oValid=$oValid_;
   }
}
    



Ainsi, plutot que d'avoir du code dépendant comme ceci:

  
$iId
=_root::getParam('id',null);
if(
$iId==null){
   $oAuteur=new row_auteur  
}else{
   $oAuteur=model_auteur::getInstance()->findById_root::getParam('id',null) );
}

$tColumn=array('nom');
foreach(
$tColumn as $sColumn){
   $oAuteur->$sColumn=_root::getParam($sColumn,null) ;
}


if(
$oAuteur->save()){
   //une fois enregistre on redirige (vers la page liste)
   _root::redirect('auteur::list');
}else{
   return $oAuteur->getListError();
}
    


Où il est notamment très difficile de mettre des tests unitaires, nous avons plutot ceci:

  
$tParams 
_root::getRequest()->getParams();

$oBusiness = new business_crudUsers(model_Users::getInstance(), _root::getI18n(), new plugin_sc_valid() );

$iId _root::getParam('id'null);
if (
$iId == null) {
   if (false === $oBusiness->insertItem(new row_Users$tParams)) {
       return $oBusiness->getReturn()->getData('tError');
   }
} else {
   if (false === $oBusiness->updateItem(_root::getParam('id'), $tParams)) {
       return $oBusiness->getReturn()->getData('tError');
   }
}

//une fois enregistre on redirige (vers la page liste)
_root::redirect('global_Users::list');
    



Dont le code, par exemple de la méthode "updateItem" utilise les paramètres passés dans le constructeur:

  
   
public function updateItem($id_$tParam_) {
       $oValid $this->getCheck($tParam_);
       if (!$oValid->isValid()) {
           return $this->sendReturn(false, array('tError' => $oValid->getListError()));
       }

       $oUsers_=$this->_oModel->findByID($id_);
       foreach ($this->_tColumn as $sColummn) {
           $oUsers_->$sColummn $tParam_[$sColummn];
       }

       $this->_oModel->update($oUsers_);


       return true;
   }