Changeset 4478
- Timestamp:
- 06/06/08 20:48:05 (13 months ago)
- Location:
- branches/0.11
- Files:
-
- 5 modified
-
lib/Doctrine/Query.php (modified) (3 diffs)
-
lib/Doctrine/Query/Abstract.php (modified) (3 diffs)
-
lib/Doctrine/Record/Listener.php (modified) (3 diffs)
-
lib/Doctrine/Record/Listener/Chain.php (modified) (3 diffs)
-
manual/docs/en/event-listeners.txt (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/0.11/lib/Doctrine/Query.php
r4433 r4478 1108 1108 1109 1109 // invoke the preQuery hook 1110 $this-> preQuery();1110 $this->_preQuery(); 1111 1111 1112 1112 // process the DQL parts => generate the SQL parts. … … 1159 1159 $q .= ' SET ' . implode(', ', $this->_sqlParts['set']); 1160 1160 } 1161 1162 1161 1163 1162 $string = $this->applyInheritance(); … … 1220 1219 1221 1220 return $q; 1221 } 1222 1223 /** 1224 * Get the dql call back for this query 1225 * 1226 * @return array $callback 1227 */ 1228 protected function _getDqlCallback() 1229 { 1230 $callback = false; 1231 if ( ! empty($this->_dqlParts['from'])) { 1232 switch ($this->_type) { 1233 case self::DELETE: 1234 $callback = array( 1235 'callback' => 'preDqlDelete', 1236 'const' => Doctrine_Event::RECORD_DQL_DELETE 1237 ); 1238 break; 1239 case self::UPDATE: 1240 $callback = array( 1241 'callback' => 'preDqlUpdate', 1242 'const' => Doctrine_Event::RECORD_DQL_UPDATE 1243 ); 1244 break; 1245 case self::SELECT: 1246 $callback = array( 1247 'callback' => 'preDqlSelect', 1248 'const' => Doctrine_Event::RECORD_DQL_SELECT 1249 ); 1250 break; 1251 } 1252 } 1253 1254 return $callback; 1255 } 1256 1257 /** 1258 * Pre query method which invokes the pre*Query() methods on the model instance or any attached 1259 * record listeners 1260 * 1261 * @return void 1262 */ 1263 protected function _preQuery() 1264 { 1265 $callback = $this->_getDqlCallback(); 1266 1267 // if there is no callback for the query type, then we can return early 1268 if ( ! $callback) { 1269 return; 1270 } 1271 1272 // parse the FROM clause to find all models used in the DQL 1273 $from = new Doctrine_Query_From($this); 1274 $this->_components = array(); 1275 foreach ($this->_dqlParts['from'] as $key => $table) { 1276 $componentClause = $from->parse($table, true); 1277 foreach ($componentClause as $c) { 1278 // remove the prefix if there is one (aka "f.Bar" => "Bar") 1279 $component = explode('.', $c[0]); 1280 $component = array_pop($component); 1281 $alias = isset($c[1]) ? $c[1] : $component; 1282 $this->_components[$component] = $alias; 1283 } 1284 } 1285 1286 foreach ($this->_components as $component => $alias) { 1287 if (class_exists($component)) { 1288 $componentObj = Doctrine::getTable($component); 1289 $record = $componentObj->getRecordInstance(); 1290 1291 // check (and call) preDql*() callback on the model class 1292 if (method_exists($record, $callback['callback'])) { 1293 $record->$callback['callback']($this, $component, $alias); 1294 } 1295 1296 // trigger preDql*() callback event 1297 $params = array('component`' => $component, 'alias' => $alias); 1298 $event = new Doctrine_Event($record, $callback['const'], $this, $params); 1299 $componentObj->getRecordListener()->$callback['callback']($event); 1300 } 1301 } 1302 1303 // Invoke preQuery() hook on Doctrine_Query for child classes which implement this hook 1304 $this->preQuery(); 1305 } 1306 1307 /** 1308 * Blank hook methods which can be implemented in Doctrine_Query child classes 1309 * 1310 * @return void 1311 */ 1312 public function preQuery() 1313 { 1222 1314 } 1223 1315 -
branches/0.11/lib/Doctrine/Query/Abstract.php
r4467 r4478 911 911 912 912 /** 913 * Get dql call back for the pre/postQuery() methods914 *915 * @param string $prePost916 * @return array $callback917 */918 private function getDqlCallback($prePost)919 {920 $callback = false;921 if ( ! empty($this->_dqlParts['from'])) {922 switch ($this->_type) {923 case self::DELETE:924 $callback = array(925 'callback' => $prePost.'DqlDelete',926 'const' => Doctrine_Event::RECORD_DQL_DELETE927 );928 break;929 case self::UPDATE:930 $callback = array(931 'callback' => $prePost.'DqlUpdate',932 'const' => Doctrine_Event::RECORD_DQL_UPDATE933 );934 break;935 case self::SELECT:936 $callback = array(937 'callback' => $prePost.'DqlSelect',938 'const' => Doctrine_Event::RECORD_DQL_SELECT939 );940 break;941 }942 }943 944 return $callback;945 }946 947 /**948 * Trigger the DQL listeners if they exist949 *950 * @param array $callback951 * @return void952 */953 private function triggerDqlListener($callback)954 {955 // if there is no callback for the query type, then we can return early956 if ( ! $callback) {957 return;958 }959 960 foreach ($this->_components as $component => $alias) {961 if (class_exists($component)) {962 $componentObj = Doctrine::getTable($component);963 $record = $componentObj->getRecordInstance();964 965 // check (and call) preDql*() callback on the model class966 if (method_exists($record, $callback['callback'])) {967 $record->$callback['callback']($this, $component, $alias);968 }969 970 // trigger preDql*() callback event971 $params = array('component`' => $component, 'alias' => $alias);972 $event = new Doctrine_Event($record, $callback['const'], $this, $params);973 $componentObj->getRecordListener()->$callback['callback']($event);974 }975 }976 }977 978 /**979 * Pre query method which invokes the pre*Query() methods on the model instance or any attached980 * record listeners981 *982 * @return void983 */984 public function preQuery()985 {986 $callback = $this->getDqlCallback('pre');987 // if there is no callback for the query type, then we can return early988 if ( ! $callback) {989 return;990 }991 992 // parse the FROM clause to find all models used in the DQL993 $from = new Doctrine_Query_From($this);994 $this->_components = array();995 foreach ($this->_dqlParts['from'] as $key => $table) {996 $componentClause = $from->parse($table, true);997 foreach ($componentClause as $c) {998 // remove the prefix if there is one (aka "f.Bar" => "Bar")999 $component = explode('.', $c[0]);1000 $component = array_pop($component);1001 $alias = isset($c[1]) ? $c[1] : $component;1002 $this->_components[$component] = $alias;1003 }1004 }1005 1006 $this->triggerDqlListener($callback);1007 }1008 1009 /**1010 * Same as preQuery() exist for post1011 *1012 * @return void1013 */1014 public function postQuery()1015 {1016 $callback = $this->getDqlCallback('post');1017 $this->triggerDqlListener($callback);1018 }1019 1020 /**1021 913 * _execute 1022 914 * … … 1072 964 public function execute($params = array(), $hydrationMode = null) 1073 965 { 1074 // invoke the preQuery hook1075 $this->preQuery();1076 1077 966 if ($hydrationMode !== null) { 1078 967 $this->_hydrator->setHydrationMode($hydrationMode); … … 1115 1004 } 1116 1005 } 1117 1118 // invoke the postQuery hook1119 $this->postQuery();1120 1006 1121 1007 return $result; -
branches/0.11/lib/Doctrine/Record/Listener.php
r4433 r4478 48 48 { } 49 49 50 public function postDqlSelect(Doctrine_Event $event)51 { }52 53 50 public function preSave(Doctrine_Event $event) 54 51 { } … … 60 57 { } 61 58 62 public function postDqlDelete(Doctrine_Event $event)63 { }64 65 59 public function preDelete(Doctrine_Event $event) 66 60 { } … … 70 64 71 65 public function preDqlUpdate(Doctrine_Event $event) 72 { }73 74 public function postDqlUpdate(Doctrine_Event $event)75 66 { } 76 67 -
branches/0.11/lib/Doctrine/Record/Listener/Chain.php
r4433 r4478 124 124 } 125 125 126 public function postDqlSelect(Doctrine_Event $event)127 {128 foreach ($this->_listeners as $listener) {129 $listener->preDqlSelect($event);130 }131 }132 133 126 public function preSave(Doctrine_Event $event) 134 127 { … … 152 145 } 153 146 154 public function postDqlDelete(Doctrine_Event $event)155 {156 foreach ($this->_listeners as $listener) {157 $listener->preDqlDelete($event);158 }159 }160 161 147 public function preDelete(Doctrine_Event $event) 162 148 { … … 180 166 } 181 167 182 public function postDqlUpdate(Doctrine_Event $event)183 {184 foreach ($this->_listeners as $listener) {185 $listener->preDqlUpdate($event);186 }187 }188 189 168 public function preUpdate(Doctrine_Event $event) 190 169 { -
branches/0.11/manual/docs/en/event-listeners.txt
r4440 r4478 218 218 || preDqlUpdate(Doctrine_Event $event) || Doctrine_Query::create()->update('User')->set('name', '?', 'jwage')->execute() || 219 219 || postUpdate(Doctrine_Event $event) || Doctrine_Record::save() when the record state is DIRTY || 220 || postDqlUpdate(Doctrine_Event $event) || Doctrine_Query::create()->update('User')->set('name', '?', 'jwage')->execute() ||221 220 || preInsert(Doctrine_Event $event) || Doctrine_Record::save() when the record state is TDIRTY || 222 221 || postInsert(Doctrine_Event $event) || Doctrine_Record::save() when the record state is TDIRTY || … … 224 223 || preDqlDelete(Doctrine_Event $event) || Doctrine_Query::create()->delete()->from('User')->execute() || 225 224 || postDelete(Doctrine_Event $event) || Doctrine_Record::delete() || 226 || postDqlDelete(Doctrine_Event $event) || Doctrine_Query::create()->delete()->from('User')->execute() ||227 225 || preValidate(Doctrine_Event $event) || Doctrine_Validator::validate() || 228 226 || postValidate(Doctrine_Event $event) || Doctrine_Validator::validate() || 229 227 || preDqlSelect(Doctrine_Event $event) || Doctrine_Query::create()->from('User u')->execute() || 230 || postDqlSelect(Doctrine_Event $event) || Doctrine_Query::create()->from('User u')->execute() ||231 228 232 229 Just like with connection listeners there are three ways of defining a record listener: by extending … … 313 310 || preDqlUpdate(Doctrine_Event $event) || Doctrine_Query::create()->update('User')->set('name', '?', 'jwage')->execute() || 314 311 || postUpdate(Doctrine_Event $event) || Doctrine_Record::save() when the record state is DIRTY || 315 || postDqlUpdate(Doctrine_Event $event) || Doctrine_Query::create()->update('User')->set('name', '?', 'jwage')->execute() ||316 312 || preInsert(Doctrine_Event $event) || Doctrine_Record::save() when the record state is TDIRTY || 317 313 || postInsert(Doctrine_Event $event) || Doctrine_Record::save() when the record state is TDIRTY || … … 319 315 || preDqlDelete(Doctrine_Event $event) || Doctrine_Query::create()->delete()->from('User')->execute() || 320 316 || postDelete(Doctrine_Event $event) || Doctrine_Record::delete() || 321 || postDqlDelete(Doctrine_Event $event) || Doctrine_Query::create()->delete()->from('User')->execute() ||322 317 || preValidate(Doctrine_Event $event) || Doctrine_Validator::validate() || 323 318 || postValidate(Doctrine_Event $event) || Doctrine_Validator::validate() || 324 319 || preDqlSelect(Doctrine_Event $event) || Doctrine_Query::create()->from('User u')->execute() || 325 || postDqlSelect(Doctrine_Event $event) || Doctrine_Query::create()->from('User u')->execute() ||326 320 327 321 Example 1. Using insert and update hooks