Phalcon7 中几乎所有的组件都继承自 Phalcon\Di\Injectable,它们都可以通过 attachEvent 来设置对应事件的回调函数。
以下面示例中,我们使用 attachEvent 设置MySQL连接中产生的事件的回调函数:
<?php
use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
$connection = new DbAdapter(
array(
"host" => "localhost",
"username" => "root",
"password" => "secret",
"dbname" => "invo"
)
);
$connection->attachEvent('beforeExecutePrepare', function($event, $statement, $prevData = NULL){
});
$connection->query("SELECT * FROM products p WHERE p.status = 1");
几乎所有 Phalcon 对象都可以通过 fireEvent() 或 fireEventCancel() 方法来执行事件:
<?php
$connection->fireEvent("my-component:afterSomeTask", $extraData);
可以通过返回 false 会阻止应用后续动作并且停止继续下发的事件:
| Name | Can return value |
|---|---|
| acl:beforeCheckAccess | NO |
| dispatch:beforeDispatchLoop | NO |
| dispatch:beforeDispatch | NO |
| dispatch:beforeNotFoundAction | NO |
| dispatch:beforeExecuteRoute | NO |
| dispatch:beforeInitialize | NO |
| dispatch:afterInitialize | NO |
| dispatch:beforeException | NO |
| application:boot | NO |
| application:beforeHandleRouter | NO |
| application:afterHandleRouter | NO |
| application:beforeStartModule | NO |
| application:afterStartModule | NO |
| application:beforeHandleRequest | NO |
| application:afterHandleRequest | NO |
| application:beforeRenderView | NO |
| console:beforeStartModule | NO |
| console:afterStartModule | NO |
| console:beforeHandleTask | NO |
| router:beforeHandle | Yes |
| router:afterHandleRouter | NO |
| micro:beforeHandleRoute | NO |
| micro:beforeExecuteRoute | NO |
| micro:beforeNotFound | NO |
| model:beforeValidation | NO |
| model:beforeValidationOnCreate | NO |
| model:beforeValidationOnUpdate | NO |
| model:validation | NO |
| model:afterValidationOnCreate | NO |
| model:afterValidationOnUpdate | NO |
| model:afterValidation | NO |
| model:beforeSave | NO |
| model:beforeUpdate | NO |
| model:beforeCreate | NO |
| model:beforeOperation | NO |
| model:beforeDelete | NO |
| view:beforeRender | NO |
| view:beforeRenderView | NO |
| db:beforeExecutePrepared | NO |
| db:afterExecutePrepared | NO |
| db:beforeQuery | NO |
| db:beforeExecute | NO |
只能可以通过 stop() 停止的继续下发的事件:
| Name | Can return value |
|---|---|
| acl:afterCheckAccess | NO |
| loader:beforeCheckPath | NO |
| loader:pathFound | NO |
| loader:beforeCheckClass | NO |
| loader:afterCheckClass | NO |
| di:beforeServiceResolve | NO |
| di:afterServiceResolve | NO |
| di:afterServiceResolve | NO |
| dispatch:afterExecuteRoute | NO |
| dispatch:afterDispatch | NO |
| dispatch:afterDispatchLoop | NO |
| dispatch:beforeForward | NO |
| dispatch:beforeException | NO |
| application:beforeCheckUseImplicitView | NO |
| application:afterCheckUseImplicitView | NO |
| application:afterRenderView | NO |
| application:beforeSendResponse | NO |
| application:afterSendResponse | NO |
| console:afterHandleTask | NO |
| view:afterRenderView | NO |
| view:notFoundView | NO |
| pagination:beforeGetPaginate | NO |
| pagination:afterGetPaginate | Yes |
| router:beforeCheckRoutes | NO |
| router:beforeCheckRoute | NO |
| router:matchedRoute | NO |
| router:notMatchedRoute | NO |
| router:afterCheckRoutes | NO |
| micro:afterExecuteRoute | NO |
| micro:afterHandleRoute | NO |
| model:beforeQuery | YES |
| model:afterQuery | YES |
| model:notDeleted | NO |
| model:notSaved | NO |
| model:onValidationFails | NO |
| model:afterUpdate | NO |
| model:afterCreate | NO |
| model:afterDelete | NO |
| model:afterSave | NO |
| model:afterOperation | NO |
| model:beforeToArray | NO |
| model:afterToArray | YES |
| modelsManager:beforeInitialize | NO |
| modelsManager:afterInitialize | NO |
| view:afterRender | NO |
| query:beforePrepareSelect | NO |
| query:afterPrepareSelect | NO |
| query:beforePrepareInsert | NO |
| query:afterPrepareInsert | NO |
| query:beforePrepareUpdate | NO |
| query:afterPrepareUpdate | NO |
| query:beforePrepareDelete | NO |
| query:afterPrepareDelete | NO |
| query:beforeParse | YES |
| query:afterParse | YES |
| query:beforeExecuteSelect | NO |
| query:beforeGenerateSQLStatement | NO |
| query:afterGenerateSQLStatement | YES |
| query:afterExecuteSelect | NO |
| query:beforeExecuteInsert | NO |
| query:afterExecuteInsert | NO |
| query:beforeExecuteUpdate | NO |
| query:afterExecuteUpdate | NO |
| query:beforeExecuteDelete | NO |
| query:afterExecuteDelete | NO |
| query:beforeExecute | YES |
| query:afterExecute | YES |
| db:afterQuery | NO |
| db:afterExecute | NO |
| db:beginTransaction | NO |
| db:beforeCreateSavepoint | NO |
| db:afterCreateSavepoint | NO |
| db:beforeRollbackTransaction | NO |
| db:afterRollbackTransaction | NO |
| db:BeforeRollbackSavepoint | NO |
| db:afterRollbackSavepoint | NO |
| db:beforeCommitTransaction | NO |
| db:afterCommitTransaction | NO |
| db:beforeReleaseSavepoint | NO |
| db:afterReleaseSavepoint | NO |
示例:
<?php
$eventsManager = new Phalcon\Events\Manager();
$eventsManager->attach('model:beforeQuery', function($event, $model, $data, $prevdata) {
if (!$prevdata) {
return ['data' => 1];
}
return $prevdata;
});
$eventsManager->attach('model:beforeQuery', function($event, $model, $data, $prevdata) {
if (!$prevdata) {
return [];
}
$prevdata['data2'] = 2;
return $prevdata;
});
$di = new Phalcon\Di\FactoryDefault;
$di->set('modelsManager', function() use ($eventsManager) {
$modelsManager = new Phalcon\Mvc\Model\Manager();
$modelsManager->setEventsManager($eventsManager);
return $modelsManager;
}, true);
class Robots extends Phalcon\Mvc\Model {
public function beforeQuery($event, $data, $prevdata) {
if (!$prevdata) {
return [];
}
$prevdata['data3'] = 3;
return $prevdata;
}
}
var_dump(Robots::find());
输出:
array(2) {
["data"]=>
int(1)
["data2"]=>
int(2)
["data3"]=>
int(3)
}