使用 Phalcon 创建一个插件系统


Creating a Plugin System with Phalcon

我一直在研究如何使用Phalcon创建一个插件系统。我已经检查了INVO教程,事件管理更具体。看起来这不是我真正需要的。

在此示例中,它是在建立数据库连接之前手动加载插件。

  1. 我需要能够访问数据库以检查插件是否实际安装和激活。因此,我可以检索已安装和激活的插件的设置,并将它们动态添加到应用程序中。

  2. 我需要能够将插件附加到几乎任何地方; 控制器(在方法执行之前/之后/期间),模型(在方法执行之前,之后,在方法执行中)等。

Phalcon 是否提供了这样的功能,或者我是否必须提前尝试在不使用任何框架功能的情况下创建自己的逻辑?

你有什么例子来说明你会让插件做什么吗?或者关于活动管理缺乏的具体细节?

我认为您应该能够使用依赖注入和事件管理获得一个非常灵活的系统。

看起来您可以在运行应用程序之前使用 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;
});