我一直在研究如何使用Phalcon创建插件系统。我已经检查了INVO教程,Events Management更具体。看起来这不是我真正需要的。
在这个example中,它在手动加载插件并建立数据库连接之前。
我需要能够访问数据库以检查插件是否实际安装并激活。所以我可以检索已安装和安装的设置。激活插件并将其动态添加到应用程序。
我需要能够将插件附加到任何地方;控制器(在方法执行之前/之后/之内),模型(在方法执行之前,之后,之后)等。
Phalcon是否提供此类功能,或者我必须提前尝试创建自己的逻辑而不使用任何框架功能?
答案 0 :(得分:1)
你有任何插件可以做的例子吗?或者关于事件管理缺乏的具体细节?
我认为你应该能够使用依赖注入和事件管理来获得一个非常灵活的系统。
在运行应用程序之前,您可以使用phalcon模型,只要在进样器中设置db后放置代码即可。
$plugins = \Plugin::find([
'active = :active:',
'bind'=>[
'active'=>1
]
]);
foreach($plugins as $plugin){
if(file_exists($plugin->filename)){
include $plugin->filename;
}
}
并且在文件中您可以使用代码订阅事件和/或添加新的依赖项。
// plugin file - for a db logger
$eventsManager = new \Phalcon\Events\Manager();
$logger = new \PhalconX\Logger\Adapter\Basic();
$profiler = $phalconDi->getProfiler();
$eventsManager->attach('db', function($event, $phalconConnection) use ($logger, $profiler) {
if ($event->getType() == 'beforeQuery') {
$profiler->startProfile($phalconConnection->getSQLStatement());
$logger->log($phalconConnection->getSQLStatement(), \Phalcon\Logger::INFO, $phalconConnection->getSQLVariables());
}
if ($event->getType() == 'afterQuery') {
$profiler->stopProfile();
}
});
或
class myHelper{ ... }
$phalconDi->set('myHelper', function() use ($phalconConfig, $phalconDi) {
$helper = new myHelper();
$helper->setDi( $phalconDi );
return $helper;
});