Software Craftsmanship
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();
}
$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;
}