pictcode / lib / Cake / Model / ModelBehavior.php @ ceb21f43
履歴 | 表示 | アノテート | ダウンロード (7.995 KB)
| 1 | 635eef61 | spyder1211 | <?php
 | 
|---|---|---|---|
| 2 | /**
 | ||
| 3 |  * Model behaviors base class.
 | ||
| 4 |  *
 | ||
| 5 |  * Adds methods and automagic functionality to CakePHP Models.
 | ||
| 6 |  *
 | ||
| 7 |  * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 | ||
| 8 |  * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 | ||
| 9 |  *
 | ||
| 10 |  * Licensed under The MIT License
 | ||
| 11 |  * For full copyright and license information, please see the LICENSE.txt
 | ||
| 12 |  * Redistributions of files must retain the above copyright notice.
 | ||
| 13 |  *
 | ||
| 14 |  * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 | ||
| 15 |  * @link          http://cakephp.org CakePHP(tm) Project
 | ||
| 16 |  * @package       Cake.Model
 | ||
| 17 |  * @since         CakePHP(tm) v 1.2.0.0
 | ||
| 18 |  * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 | ||
| 19 |  */
 | ||
| 20 | |||
| 21 | /**
 | ||
| 22 |  * Model behavior base class.
 | ||
| 23 |  *
 | ||
| 24 |  * Defines the Behavior interface, and contains common model interaction functionality. Behaviors
 | ||
| 25 |  * allow you to simulate mixins, and create reusable blocks of application logic, that can be reused across
 | ||
| 26 |  * several models. Behaviors also provide a way to hook into model callbacks and augment their behavior.
 | ||
| 27 |  *
 | ||
| 28 |  * ### Mixin methods
 | ||
| 29 |  *
 | ||
| 30 |  * Behaviors can provide mixin like features by declaring public methods. These methods should expect
 | ||
| 31 |  * the model instance to be shifted onto the parameter list.
 | ||
| 32 |  *
 | ||
| 33 |  * ```
 | ||
| 34 |  * function doSomething(Model $model, $arg1, $arg2) {
 | ||
| 35 |  *                //do something
 | ||
| 36 |  * }
 | ||
| 37 |  * ```
 | ||
| 38 |  *
 | ||
| 39 |  * Would be called like `$this->Model->doSomething($arg1, $arg2);`.
 | ||
| 40 |  *
 | ||
| 41 |  * ### Mapped methods
 | ||
| 42 |  *
 | ||
| 43 |  * Behaviors can also define mapped methods. Mapped methods use pattern matching for method invocation. This
 | ||
| 44 |  * allows you to create methods similar to Model::findAllByXXX methods on your behaviors. Mapped methods need to
 | ||
| 45 |  * be declared in your behaviors `$mapMethods` array. The method signature for a mapped method is slightly different
 | ||
| 46 |  * than a normal behavior mixin method.
 | ||
| 47 |  *
 | ||
| 48 |  * ```
 | ||
| 49 |  * public $mapMethods = array('/do(\w+)/' => 'doSomething');
 | ||
| 50 |  *
 | ||
| 51 |  * function doSomething(Model $model, $method, $arg1, $arg2) {
 | ||
| 52 |  *                //do something
 | ||
| 53 |  * }
 | ||
| 54 |  * ```
 | ||
| 55 |  *
 | ||
| 56 |  * The above will map every doXXX() method call to the behavior. As you can see, the model is
 | ||
| 57 |  * still the first parameter, but the called method name will be the 2nd parameter. This allows
 | ||
| 58 |  * you to munge the method name for additional information, much like Model::findAllByXX.
 | ||
| 59 |  *
 | ||
| 60 |  * @package       Cake.Model
 | ||
| 61 |  * @see Model::$actsAs
 | ||
| 62 |  * @see BehaviorCollection::load()
 | ||
| 63 |  */
 | ||
| 64 | class ModelBehavior extends Object { | ||
| 65 | |||
| 66 | /**
 | ||
| 67 |  * Contains configuration settings for use with individual model objects. This
 | ||
| 68 |  * is used because if multiple models use this Behavior, each will use the same
 | ||
| 69 |  * object instance. Individual model settings should be stored as an
 | ||
| 70 |  * associative array, keyed off of the model name.
 | ||
| 71 |  *
 | ||
| 72 |  * @var array
 | ||
| 73 |  * @see Model::$alias
 | ||
| 74 |  */
 | ||
| 75 | public $settings = array(); | ||
| 76 | |||
| 77 | /**
 | ||
| 78 |  * Allows the mapping of preg-compatible regular expressions to public or
 | ||
| 79 |  * private methods in this class, where the array key is a /-delimited regular
 | ||
| 80 |  * expression, and the value is a class method. Similar to the functionality of
 | ||
| 81 |  * the findBy* / findAllBy* magic methods.
 | ||
| 82 |  *
 | ||
| 83 |  * @var array
 | ||
| 84 |  */
 | ||
| 85 | public $mapMethods = array(); | ||
| 86 | |||
| 87 | /**
 | ||
| 88 |  * Setup this behavior with the specified configuration settings.
 | ||
| 89 |  *
 | ||
| 90 |  * @param Model $model Model using this behavior
 | ||
| 91 |  * @param array $config Configuration settings for $model
 | ||
| 92 |  * @return void
 | ||
| 93 |  */
 | ||
| 94 | public function setup(Model $model, $config = array()) { | ||
| 95 | } | ||
| 96 | |||
| 97 | /**
 | ||
| 98 |  * Clean up any initialization this behavior has done on a model. Called when a behavior is dynamically
 | ||
| 99 |  * detached from a model using Model::detach().
 | ||
| 100 |  *
 | ||
| 101 |  * @param Model $model Model using this behavior
 | ||
| 102 |  * @return void
 | ||
| 103 |  * @see BehaviorCollection::detach()
 | ||
| 104 |  */
 | ||
| 105 | public function cleanup(Model $model) { | ||
| 106 | if (isset($this->settings[$model->alias])) { | ||
| 107 | unset($this->settings[$model->alias]); | ||
| 108 | } | ||
| 109 | } | ||
| 110 | |||
| 111 | /**
 | ||
| 112 |  * beforeFind can be used to cancel find operations, or modify the query that will be executed.
 | ||
| 113 |  * By returning null/false you can abort a find. By returning an array you can modify/replace the query
 | ||
| 114 |  * that is going to be run.
 | ||
| 115 |  *
 | ||
| 116 |  * @param Model $model Model using this behavior
 | ||
| 117 |  * @param array $query Data used to execute this query, i.e. conditions, order, etc.
 | ||
| 118 |  * @return bool|array False or null will abort the operation. You can return an array to replace the
 | ||
| 119 |  *   $query that will be eventually run.
 | ||
| 120 |  */
 | ||
| 121 | public function beforeFind(Model $model, $query) { | ||
| 122 | return true; | ||
| 123 | } | ||
| 124 | |||
| 125 | /**
 | ||
| 126 |  * After find callback. Can be used to modify any results returned by find.
 | ||
| 127 |  *
 | ||
| 128 |  * @param Model $model Model using this behavior
 | ||
| 129 |  * @param mixed $results The results of the find operation
 | ||
| 130 |  * @param bool $primary Whether this model is being queried directly (vs. being queried as an association)
 | ||
| 131 |  * @return mixed An array value will replace the value of $results - any other value will be ignored.
 | ||
| 132 |  */
 | ||
| 133 | public function afterFind(Model $model, $results, $primary = false) { | ||
| 134 | } | ||
| 135 | |||
| 136 | /**
 | ||
| 137 |  * beforeValidate is called before a model is validated, you can use this callback to
 | ||
| 138 |  * add behavior validation rules into a models validate array. Returning false
 | ||
| 139 |  * will allow you to make the validation fail.
 | ||
| 140 |  *
 | ||
| 141 |  * @param Model $model Model using this behavior
 | ||
| 142 |  * @param array $options Options passed from Model::save().
 | ||
| 143 |  * @return mixed False or null will abort the operation. Any other result will continue.
 | ||
| 144 |  * @see Model::save()
 | ||
| 145 |  */
 | ||
| 146 | public function beforeValidate(Model $model, $options = array()) { | ||
| 147 | return true; | ||
| 148 | } | ||
| 149 | |||
| 150 | /**
 | ||
| 151 |  * afterValidate is called just after model data was validated, you can use this callback
 | ||
| 152 |  * to perform any data cleanup or preparation if needed
 | ||
| 153 |  *
 | ||
| 154 |  * @param Model $model Model using this behavior
 | ||
| 155 |  * @return mixed False will stop this event from being passed to other behaviors
 | ||
| 156 |  */
 | ||
| 157 | public function afterValidate(Model $model) { | ||
| 158 | return true; | ||
| 159 | } | ||
| 160 | |||
| 161 | /**
 | ||
| 162 |  * beforeSave is called before a model is saved. Returning false from a beforeSave callback
 | ||
| 163 |  * will abort the save operation.
 | ||
| 164 |  *
 | ||
| 165 |  * @param Model $model Model using this behavior
 | ||
| 166 |  * @param array $options Options passed from Model::save().
 | ||
| 167 |  * @return mixed False if the operation should abort. Any other result will continue.
 | ||
| 168 |  * @see Model::save()
 | ||
| 169 |  */
 | ||
| 170 | public function beforeSave(Model $model, $options = array()) { | ||
| 171 | return true; | ||
| 172 | } | ||
| 173 | |||
| 174 | /**
 | ||
| 175 |  * afterSave is called after a model is saved.
 | ||
| 176 |  *
 | ||
| 177 |  * @param Model $model Model using this behavior
 | ||
| 178 |  * @param bool $created True if this save created a new record
 | ||
| 179 |  * @param array $options Options passed from Model::save().
 | ||
| 180 |  * @return bool
 | ||
| 181 |  * @see Model::save()
 | ||
| 182 |  */
 | ||
| 183 | public function afterSave(Model $model, $created, $options = array()) { | ||
| 184 | return true; | ||
| 185 | } | ||
| 186 | |||
| 187 | /**
 | ||
| 188 |  * Before delete is called before any delete occurs on the attached model, but after the model's
 | ||
| 189 |  * beforeDelete is called. Returning false from a beforeDelete will abort the delete.
 | ||
| 190 |  *
 | ||
| 191 |  * @param Model $model Model using this behavior
 | ||
| 192 |  * @param bool $cascade If true records that depend on this record will also be deleted
 | ||
| 193 |  * @return mixed False if the operation should abort. Any other result will continue.
 | ||
| 194 |  */
 | ||
| 195 | public function beforeDelete(Model $model, $cascade = true) { | ||
| 196 | return true; | ||
| 197 | } | ||
| 198 | |||
| 199 | /**
 | ||
| 200 |  * After delete is called after any delete occurs on the attached model.
 | ||
| 201 |  *
 | ||
| 202 |  * @param Model $model Model using this behavior
 | ||
| 203 |  * @return void
 | ||
| 204 |  */
 | ||
| 205 | public function afterDelete(Model $model) { | ||
| 206 | } | ||
| 207 | |||
| 208 | /**
 | ||
| 209 |  * DataSource error callback
 | ||
| 210 |  *
 | ||
| 211 |  * @param Model $model Model using this behavior
 | ||
| 212 |  * @param string $error Error generated in DataSource
 | ||
| 213 |  * @return void
 | ||
| 214 |  */
 | ||
| 215 | public function onError(Model $model, $error) { | ||
| 216 | } | ||
| 217 | |||
| 218 | /**
 | ||
| 219 |  * If $model's whitelist property is non-empty, $field will be added to it.
 | ||
| 220 |  * Note: this method should *only* be used in beforeValidate or beforeSave to ensure
 | ||
| 221 |  * that it only modifies the whitelist for the current save operation. Also make sure
 | ||
| 222 |  * you explicitly set the value of the field which you are allowing.
 | ||
| 223 |  *
 | ||
| 224 |  * @param Model $model Model using this behavior
 | ||
| 225 |  * @param string $field Field to be added to $model's whitelist
 | ||
| 226 |  * @return void
 | ||
| 227 |  */
 | ||
| 228 | protected function _addToWhitelist(Model $model, $field) { | ||
| 229 | if (is_array($field)) { | ||
| 230 | foreach ($field as $f) { | ||
| 231 | $this->_addToWhitelist($model, $f); | ||
| 232 | } | ||
| 233 |                         return;
 | ||
| 234 | } | ||
| 235 | if (!empty($model->whitelist) && !in_array($field, $model->whitelist)) { | ||
| 236 | $model->whitelist[] = $field; | ||
| 237 | } | ||
| 238 | } | ||
| 239 | |||
| 240 | } |