рд╕рдорд╕реНрдпрд╛
рдЕрдХреНрд╕рд░ рдЖрдкрдХреЛ рдпрд╣ (Yii рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рд╕реА рднреА рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ):
$model = new User(); $model->name = ''; if (!$model->save()) throw new RuntimeException('Can not save!');
рдпрд╛ рддреЛ:
$model = User::model()->find(); if (!$model) throw new CHttpException(404, 'User not found!');
рдХреИрд╢рд┐рдВрдЧ:
$dependency = new \caching\TagDependency('Post'); $posts = Post::model()->cache(1000, $dependency)->findAll();
рд▓реЗрди-рджреЗрди:
$trx = $this->getDbConnection()->beginTransaction(); try { if (!$user->makePayment()) throw new \RuntimeException('Can not complete!'); $trx->commit(); } catch (\Exception $e) { $trx->rollback(); throw $e; }
рдмрд╣реБрдд рдХреЛрдб!рдирд┐рд░реНрдгрдп
рдХреЛрдб рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЕрд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдПрдБ:
$model->saveException(); User::model()->findException(); Post::model()->findAllCached();
рд╣рдо рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рд╡рд┐рдзрд┐ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ:
$user->makePaymentTrx();
рд╕рдВрдпреЛрдЬрди рднреА рд╕рдВрднрд╡ рд╣реИрдВ:
User::model()->findTrxCached()
рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП?
Yii рдкрд░, рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ ActiveRecord рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ:
class ActiveRecord extends CActiveRecord { public function __call($name, $args) { if (preg_match('/^(.+)(cached|exception|trx)$/i', $name, $matches)) { switch (strtolower($matches[2])) { case 'cached': return $this->cachedMethod($matches[1], $args); case 'exception': return $this->exceptionMethod($matches[1], $args); case 'trx': return $this->trxMethod($matches[1], $args); } } return parent::__call($name, $args); } public function trxMethod($method, $args) { $trx = $this->getDbConnection()->beginTransaction(); try { $value = call_user_func_array(array($this, $method), $args); $trx->commit(); } catch (\Exception $e) { $trx->rollback(); throw $e; } return $value; } public function exceptionMethod($method, $args) { $value = call_user_func_array(array($this, $method), $args); if (!$value) throw new Exception('False result!'); return $value; } public function cachedMethod($method, $args) { $key = get_class($this) . $method . serialize($this->getPrimaryKey()) . serialize($args) . serialize($this->getDbCriteria()); $key = md5($key); $value = \Yii::app()->cache->get($key); if ($value === false) { $value = call_user_func_array(array($this, $method), $args); \Yii::app()->cache->set($key, $value, 0, new \caching\TagDependency(get_class($this))); } else {
рд╡рд┐рдзрд┐ рдХрд╛ рдЖрдзрд╛рд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ:
preg_match('/^(.+)(cached|exception|trx)$/i', $name, $matches)
рдЖрдк рдЕрдкрдиреЗ рдкреНрд░рддреНрдпрдпреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд╛рдпрджреЗ:
- рд░реВрдЯреАрди рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВред
- рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рдФрд░ рдЖрд╕рд╛рдиред
рдиреБрдХрд╕рд╛рди:
- рдЖрдИрдбреАрдИ рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред