小規模 Web アプリケーション開発によく見かける機能をビヘイビアで実装してみる
ホスト言語側での自動採番、削除フラグが真のレコードを取得しない、順序がある…といったモデルを作る際に使えそうなビヘイビアのサンプルです。
ホスト言語側での自動採番
class HostSideIncrementableBehavior extends ModelBehavior { var $__defaults = array("increment_field" => "order"); function setup(&$model, $config = array()) { $config = array_merge($this->__defaults, $config); $this->settings[$model->alias] = $config; } function beforeSave(&$model) { $field = $this->settings[$model->alias]["increment_field"]; if (empty($model->data[$model->alias]["id"]) && empty($model->data[$model->alias][$field])) { $order = array($model->alias => array($field => "DESC")); $result = $model->find(null, null, $order, 1); if (empty($result)) { $next = 1; } else { $next = $result[$model->alias][$field] + 1; } $model->data[$model->alias][$field] = $next; } return true; } }
削除フラグが真のレコードを取得しない
class SoftwareDeletableBehavior extends ModelBehavior { var $__defaults = array("visible_field" => "visible", "visible_value" => true); function setup(&$model, $config = array()) { $config = array_merge($this->__defaults, $config); $this->settings[$model->alias] = $config; } function beforeFind(&$model, $query) { $field = $this->settings[$model->alias]["visible_field"]; $visible = $this->settings[$model->alias]["visible_value"]; if (is_array($query["conditions"])) { $query["conditions"][$model->alias. ".". $field] = $visible; } else if (strlen($query["conditions"])) { $query["conditions"] = array($query["conditions"]); $query["conditions"][$model->alias. ".". $field] = $visible; } else { $query["conditions"] = array(); $query["conditions"][$model->alias. ".". $field] = $visible; } return $query; } }
順序がある
class SortableBehavior extends ModelBehavior { var $__defaults = array("order_field" => "order", "order_direction" => "ASC"); function setup(&$model, $config = array()) { $config = array_merge($this->__defaults, $config); $this->settings[$model->alias] = $config; } function beforeFind(&$model, $query) { $field = $this->settings[$model->alias]["order_field"]; $direction = $this->settings[$model->alias]["order_direction"]; if (is_array($query["order"])) { $query["order"][$model->alias] = array($field => $direction); } else if (strlen($query["order"])) { $query["order"] = array($query["order"]); $query["order"][$model->alias] = array($field => $direction); } else { $query["order"] = array(); $query["order"][$model->alias] = array($field => $direction); } return $query; } }
やはり CakePHP 1.2 はオブジェクト指向が加速しますね。
