I am setting up a class called a DataMapper for an MVC framework that I am developing.
The DataMapper class will basically hold a bunch of Rules that map a data model structure to the database table/column structure – and it will list criteria for each Rule.
A simpler version of the Rule class would look like (keep in mind these code snippets are examples):
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;
}
}
}
And a simpler version of the extended DataMapper class would look like:
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;
}
}
And I am going to create these maps and rules for all my models/modules.
What I am trying to do is clean up the code / make it easier to code and follow. Is there any way to set up the class(es) so that in the DataMapper constructor I can do something like:
public function __construct() {
$this->map[] = new DataMapRule("_firstName", "FirstName", "string")
->addCriteria("maxCharLength", 50)
->addCriteria("nullOrEmpty", false)
->finalRule;
}
Advertisement
Answer
This is usually called a ‘fluid’ interface, and to implement this, all you really have to do is return $this from your addCriteria() function.
public function addCriteria($option, $val) {
if(in_array($option, $this->options)) {
$this->finalRule[$option] = $val;
}
return $this;
}
Returning $this is means that you can call addCriteria again on the result of addCriteria