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)
}