最近闲来无事想了解下基于swoole的框架——hyperf
首先来说一下安装,因为我是使用的docker,所以整体用起来比较简单,也不需要自己搭建环境了
查看框架的基本结构,基本上和laravel是差不多的,而且感觉很多设计思想应该也是借鉴了laravel框架
框架的一些使用方法文档上标注的还比较全面,但是对于框架的生命周期描述的就比较简单,由于我也是刚开始看这个框架,所以只能从代码角度来给出关于hyperf的生命周期的一些描述,如果有错误的地方,也希望更熟悉这个框架的朋友能够指正
首先来看一下,入口文件
#!/usr/bin/env php
<?php
ini_set('display_errors', 'on');
ini_set('display_startup_errors', 'on');
ini_set('memory_limit', '1G');
error_reporting(E_ALL);
date_default_timezone_set('Asia/Shanghai');
! defined('BASE_PATH') && define('BASE_PATH', dirname(__DIR__, 1));
! defined('SWOOLE_HOOK_FLAGS') && define('SWOOLE_HOOK_FLAGS', SWOOLE_HOOK_ALL);
require BASE_PATH . '/vendor/autoload.php';
// Self-called anonymous function that creates its own scope and keep the global namespace clean.
(function () {
Hyperf\Di\ClassLoader::init();
/** @var Psr\Container\ContainerInterface $container */
$container = require BASE_PATH . '/config/container.php';
$application = $container->get(Hyperf\Contract\ApplicationInterface::class);
$application->run();
})();
其中
Hyperf\Di\ClassLoader::init();部分的代码如下
public static function init(?string $proxyFileDirPath = null, ?string $configDir = null): void
{
if (! $proxyFileDirPath) {
// This dir is the default proxy file dir path of Hyperf
$proxyFileDirPath = BASE_PATH . '/runtime/container/proxy/';
}
if (! $configDir) {
// This dir is the default proxy file dir path of Hyperf
$configDir = BASE_PATH . '/config/';
}
$loaders = spl_autoload_functions();
// Proxy the composer class loader
foreach ($loaders as &$loader) {
$unregisterLoader = $loader;
if (is_array($loader) && $loader[0] instanceof ComposerClassLoader) {
/** @var ComposerClassLoader $composerClassLoader */
$composerClassLoader = $loader[0];
AnnotationRegistry::registerLoader(function ($class) use ($composerClassLoader) {
return (bool) $composerClassLoader->findFile($class);
});
$loader[0] = new static($composerClassLoader, $proxyFileDirPath, $configDir);
}
spl_autoload_unregister($unregisterLoader);
}
unset($loader);
// Re-register the loaders
foreach ($loaders as $loader) {
spl_autoload_register($loader);
}
// Initialize Lazy Loader. This will prepend LazyLoader to the top of autoload queue.
LazyLoader::bootstrap($configDir);
}
很明显的能够看出,hyperf的注解,也是使用了composer的autoload的findFile方法,复用,没的说
下面的代码
$loader[0] = new static($composerClassLoader, $proxyFileDirPath, $configDir);
则显得尤为关键,实际为hyperf代理了composer的autoload方法