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èle

Dans 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 enregistrer
Nous 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();
}
    


Et celle-ci était appelé au moment du save

  
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;
}