🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 1、超全局管理-Swoolefy\Core\Swfy类 这个是参考了Yii2的设计思想,实现全局注册树模式,将一些全局服务函数,变量保存在类文件的静态变量中,实现在每个worker|task进程中都存在完整的而且相同的上下文。 在swoolefy中,Swoolefy\Core\Swfy类作为超全局管理的类 ~~~ class Swfy extends \Swoolefy\Core\BaseObject { use \Swoolefy\Core\ServiceTrait; /** * $server swoole服务超全局变量 * @var null */ public static $server = null; /** * $config swoole服务对应协议层的配置 * @var null */ public static $config = []; /** * $appConfig 应用层的配置 * @var null */ public static $appConfig = []; /** * $com_alias_name 动态创建组件对象 * @param string $com_alias_name * @param array $defination * @return void */ public static function createComponent(string $com_alias_name, array $defination = []) { return Application::getApp()->creatObject($com_alias_name, $defination); } /** * removeComponent 销毁Component * @param string|array $com_alias_name * @return void */ public static function removeComponent($com_alias_name = null) { return Application::getApp()->clearComponent($com_alias_name); } /** * getComponent 获取组件 * @param string $com_alias_name * @return void */ public static function getComponent(string $com_alias_name = null) { return Application::getApp()->getComponents($com_alias_name); } ~~~ * trait使用 use \Swoolefy\Core\ComponentTrait, \Swoolefy\Core\ServiceTrait; 这说明Swoolefy将能使用这两个trait文件定义的函数和属性,具体可以查看文件 * $server swoole底层的服务server(例如http的\Swoole\Http\Server) 一般通过Swfy::getServer()获取,可以在任何地方使用 * $config 服务协议层配置,通过Swfy::getConf()获取,可以在任何地方使用 * appConfig 服务应用层配置,通过Swfy::getAppConf()获取,可以在任何地方使用(除了自定义进程中) * createComponent() 动态创建一个组件实例,例如创建一个视图组件实例,支持两种方式,推荐使用闭包回调的方式,这样更加灵活,只需返回组件对象即可 ~~~ // 配置模式 $view1 = Swfy:: createComponent('view1',['class'=>'Swoolefy\Core\View']) // 闭包回调模式 $view2 = Swfy::createComponent('view2', function($name) { return new Swoolefy\Core\View(); }) ~~~ #### 2、超全局管理-Swoolefy\Core\Application类 Application类其实很简单,主要是做一些全局管理 ~~~ <?php namespace Swoolefy\Core; class Application { /** * $app 应用对象 * @var null */ public static $app = null; /** * $dump 记录启动时的调试打印信息 * @var null */ public static $dump = null; /** * __construct */ public function __construct() { } /** * __destruct */ public function __destruct() { } } ~~~ 我们在Controller或者mode或者其他类中编码时,可以直接调用 ~~~ Application::getApp() 其实这个主要的用法是用来获取组件的,例如获取log组件实例,view实例 ~~~ $log = Application::getApp()->log; $view = Application::getApp()->view; ~~~ log,view这些组件名与在应用层配置文件components的定义的key一致,那么即可获取到这个组件实例 那么为什么这样子可以获取组件呢,其实就是__get的魔术方法实现,原理就是当app应用实例找不到这个属性时,就会到Di容器中找,因为组件实例都是寄存在这Di容器中,这个其实与Yii::$app相似。 具体需要了解,可以参考[https://github.com/bingcool/swoolefy/blob/master/score/Core/ComponentTrait.php](https://github.com/bingcool/swoolefy/blob/master/score/Core/ComponentTrait.php)