Estoy configurando una clase llamada DataMapper para un marco MVC que estoy desarrollando.
La clase DataMapper básicamente tendrá un montón de Reglas que asignan una estructura de modelo de datos a la estructura de tabla/columna de la base de datos, y enumerará los criterios para cada Regla.
Se vería una versión más simple de la clase Rule (tenga en cuenta que estos fragmentos de código son ejemplos):
class DataMapRule { // required rule properties public $required = array("modelName", "columnName", "type"); // optional values public $options = array("minVal", "nullOrempty", "maxCharLength"); public $finalRule = array(); // model property is the prop name in the model // column name is public function __construct($modelProperty = "", $columnName = "", $type = "") { $this->finalRule["modelName"] = $modelProperty; $this->finalRule["columnName"] = $columnName; $this->finalRule["type"] = $type; } public function addCriteria($option, $val) { if(in_array($option, $this->options)) { $this->finalRule[$option] = $val; } } }Y una versión más simple de la clase DataMapper extendida se vería así:
class UserDataMapper extends DataMapper { public $map = array(); public function __construct() { $rule = new DataMapRule("_age", "Age", "int"); $rule->addCriteria("minVal", "1"); $rule->addCriteria("nullOrEmpty", false); $this->map[] = $rule->finalRule; $rule = new DataMapRule("_firstName", "FirstName", "string"); $rule->addCriteria("maxCharLength", 50); $rule->addCriteria("nullOrEmpty", false); $this->map[] = $rule->finalRule; } }Y voy a crear estos mapas y reglas para todos mis modelos/módulos.
Lo que estoy tratando de hacer es limpiar el código/hacerlo más fácil de codificar y seguir. ¿Hay alguna forma de configurar la(s) clase(s) para que en el constructor de DataMapper pueda hacer algo como:
public function __construct() { $this->map[] = new DataMapRule("_firstName", "FirstName", "string") ->addCriteria("maxCharLength", 50) ->addCriteria("nullOrEmpty", false) ->finalRule; }Esto generalmente se llama una interfaz 'fluida', y para implementar esto, todo lo que realmente tiene que hacer es devolver $this desde su función addCriteria() .
public function addCriteria($option, $val) { if(in_array($option, $this->options)) { $this->finalRule[$option] = $val; } return $this; } Devolver $this significa que puede volver a llamar a addCriteria sobre el resultado de addCriteria