pictcode / lib / Cake / Model / ModelBehavior.php @ 0b1b8047
履歴 | 表示 | アノテート | ダウンロード (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 | } |