Software Craftsmanship
Sommaire
- Introduction- Présentation dans le builder
- Exemple d'un module utilisant l'architecture hexagonale
- L'impact sur la couche model
Les impacts sur la couche modèle
Dans les autres templates, on a tendance à deporter une partie de l'application sur le module et le modèleDans ce nouveau template, on centraliste tout dans la couche business
Vérification des données pré-enregistrement
Avant
Dans les autres templates, pour verifier la cohérence des données avant de les enregistrerNous créons une méthode isValid dans la couche model ainsi par exemple
  
private function getCheck(){
   $oPluginValid=new plugin_valid($this->getTab());
  
   $oPluginValid->isNotEmpty('monChamp','Le champ ne doit pas être vide');
  
   /* renseigner vos check ici
   $oPluginValid->isEqual('champ','valeurB','Le champ n\est pas égal à '.$valeurB);
   $oPluginValid->isNotEqual('champ','valeurB','Le champ est égal à '.$valeurB);
   $oPluginValid->isUpperThan('champ','valeurB','Le champ n\est pas supé à '.$valeurB);
   $oPluginValid->isUpperOrEqualThan('champ','valeurB','Le champ n\est pas supé ou égal à '.$valeurB);
   $oPluginValid->isLowerThan('champ','valeurB','Le champ n\est pas inférieur à '.$valeurB);
   $oPluginValid->isLowerOrEqualThan('champ','valeurB','Le champ n\est pas inférieur ou égal à '.$valeurB);
   $oPluginValid->isEmpty('champ','Le champ n\'est pas vide');
   $oPluginValid->isNotEmpty('champ','Le champ ne doit pas être vide');
   $oPluginValid->isEmailValid('champ','L\email est invalide');
   $oPluginValid->matchExpression('champ','/[0-9]/','Le champ n\'est pas au bon format');
   $oPluginValid->notMatchExpression('champ','/[a-zA-Z]/','Le champ ne doit pas être a ce format');
   */
   return $oPluginValid;
}
public function isValid(){
   return $this->getCheck()->isValid();
}
    
  
public function save(){
   if(!$this->isValid()){
       return false;
   }
   parent::save();
   return true;
}
    
Avec la classe business
L'idée étant de centraliser l'intelligence de l'application, il en est de même quant à la cohérence des données.Nous avons donc une méthode dans la classe business pour verifier la même chose:
  
public function getCheck($tParam_) {
   $this->_oValid->load($tParam_);
   foreach ($this->_tColumn as $sColumn) {
       $this->_oValid->isNotEmpty($sColumn, $this->tr('errorIsEmpty'));
   }
   return $this->_oValid;
}
    
Et au lieu de l'appeler au moment du save, nous l'appelons au début de l'appel insert/update
  
public function insertItem($oObject,$tParam_) {
   $oValid = $this->getCheck($tParam_);
   if (!$oValid->isValid()) {
       return $this->sendReturn(false, array('tError' => $oValid->getListError()));
   }
    
Trigger à l'update et/ou à l'insert
Avant
Auparavant nous ajoutions dans la méthode save de la classe row_maTable du code par exemple
  
public function save(){
   if(!$this->isValid()){
       return false;
   }
   //on ajoute l'enregistrement de la date
   $this->date_update = date('Y-m-d H:i:s');
   parent::save();
   return true;
}
    
Avec la classe business
Toujours dans l'idée de centraliser les traitements, nous ajouterons ceci dans la méthode approprié
  
public function updateItem($id_, $tParam_) {
   $oValid = $this->getCheck($tParam_);
   if (!$oValid->isValid()) {
       return $this->sendReturn(false, array('tError' => $oValid->getListError()));
   }
   $oObject=$this->_oModel->findByID($id_);
  
   $tColumn=array(    'title',    'description');
   foreach ($tColumn as $sColummn) {
       $oObject->$sColummn = $tParam_[$sColummn];
   }
   //on ajoute l'enregistrement de la date
   $oObject->date_update = date('Y-m-d H:i:s');
   $this->_oModel->update($oObject);
   return true;
}
    
note: on peut ainsi facilement différencier ce que l'on fait en cas d'insertion/mise à jour, en modifiant la méthode adéquate
Par exemple:
  
public function insertItem($oObject_,$tParam_) {
   $oValid = $this->getCheck($tParam_);
   if (!$oValid->isValid()) {
       return $this->sendReturn(false, array('tError' => $oValid->getListError()));
   }
  
  
   $tColumn=array(    'title',    'description');
   foreach ($this->_tColumn as $sColummn) {
       $oObject_->$sColummn = $tParam_[$sColummn];
   }
   //on ajoute l'enregistrement de la date
   $oObject_->date_insert = date('Y-m-d H:i:s');
   $oObject_->date_update = $oObject_->date_insert;
   $this->_oModel->insert($oObject_);
   return true;
}