therion / framework
一个小型框架
Requires
- php: >=8.2
- phpspec/prophecy-phpunit: ^1.1.0
- phpunit/phpunit: ^9.6
Requires (Dev)
- roave/security-advisories: dev-latest
README
如何使用
1. 安装
composer require therion/framework
2. 配置
您需要添加两个返回 http 数组的文件
- modules.php,它返回您的 moduleFactories 的类名
- services.php,它返回您需要的服务(例如 MysqlServce, MongoService 等。)
您还需要一个额外的文件,它返回一个用于 cli 的数组:cli-modules.php,它返回您的 cliModuleFactories 的类名
3. 在您的 index.php 中加载应用程序
$di = Application::registerApp(AppType::HTTP, $loadedModules, $loadedServices);
$di = Application::registerApp(AppType::CLI, $loadedCliModules, $loadedServices);
4. 加载您的路由
$di->getRouter()->route()->send(); 方法 send 返回来自处理器的响应。
注意:如果需要错误处理,请在此处插入
5. 处理器和模块
模块工厂需要实现 ModuleFactoryInterface。该接口请求注册路由的 registerRoutes 函数,这是注册路由所需的:)
处理器需要实现 HandlerInterface 接口。该接口请求执行函数,应在其中插入执行代码。
6. 请求和响应
您可以添加新的请求和响应类型,它们只需实现框架的 RequestInterface 或 ResponseInterface。框架默认响应是 JsonResponse
7. 加载服务
如果服务在服务配置中注册,则服务将被自动加载。
注意:如果您需要不是服务的参数,例如,可以使用以下行: Service::class => ['param1', 2, 'param3']。例如,这需要您的 DBService 或 TemplateEngineService
您还可以使用静态构造参数加载您的模块。
8. 注册模块类
在您的模块工厂中,您可以通过将它们添加到 DI 容器中,添加处理器或其他类: $this->di->getContainer()->register(ExampleHandler::class)
如果您只填充了注册函数的第一个参数,则在代码中您必须调用具有此名称的加载函数。(这意味着第二个参数是可空的)
您可以装饰类名。您必须使用第二个参数调用注册函数。第一个参数现在是一个标签,第二个参数是确切的类名。例如: ->register(SomeInterface::class, YourClass::class)。现在您可以通过加载该接口来加载 YourClass: ->load(SomeInterface::class)
如果有其他类的依赖项,您需要先注册它们。
9. 注册路由
在您的模块工厂中,您可以在 registerRoutes 函数中注册新的路由。
您可以使用路由的公共函数添加新路由。
registerGetRoute()
registerPostRoute()
registerPutRoute()
registerDeleteRoute()
第一个参数始终是唯一的路由名称
第二个参数是 uri,例如 /example
第三个参数是要调用此路由的处理器
最后一个参数是路由参数的数组
- 如果您的 uri 如
/example/{id}/something - 数组需要如下所示:
['id' => '\d+'] - 键是在您的路由 uri 中定义的名称,值是该变量的正则表达式(因此您可以为此变量添加任何您想要的内容,并且它将在请求中作为路由参数可用)
10. 注册可调用
您可以在 DI 中注册可调用。例如,对于类的静态初始化,如请求的 ::fromGlobals() 方法(见 11。)
您可以通过使用容器的 registerCallable(string $className, callable $callback) 方法来注册它们。
您可以使用容器中的 loadCallable(string $className) 方法来加载条目。注意该方法执行可调用方法。
11. 使用静态参数注册类
您可以使用静态参数注册类,例如 defaultUserId 或其他。
为此,您需要在 DI-容器的注册函数中传递参数。
$di->getContainer()->register(YourClass:class, null, ['value1', 'value2']
您还可以命名您的参数:(不推荐,但对于复杂类是可能的...性能!)
$di->getContainer()->register(YourClass:class, null, ['paramName2' => 'value2', 'paramName1' => 'value2']
DI 将参数与其正确位置匹配。
12. 注册您自己的请求或响应类
您可以通过将它们添加到 DI 中来注册您自己的请求或响应类。有两种方法可以添加它们
services.php 用于整个项目
return [
HttpRequest::class, fn() => HttpRequest::fromGlobals(),
HttpResponse::class, fn() => new HttpResponse()
];
在模块工厂中
$this->di->getContainer()->registerCallable(RequestInterface::class, fn() => HttpRequest::fromGlobals());
$this->di->getContainer()->registerCallable(ResponseInterface::class, fn() => new HttpResponse(''));
13. 使用中间件
该框架支持通过替换默认的 HttpRouter 为您自己的路由对象来使用中间件。在这个类中,您可以通过路由添加中间件。
AppType:Cli
命令行部分与 HTTP 部分相同,有一些变化。您总是将 "cli" 放在您的接口名称中:CliHandlerInterface,CliModuleFactoryInterface
DI 和其他类几乎相同。不同之处在于处理程序,您在执行方法中不会有返回值。您没有请求,而是有 Arguments,这是对您的 $argv 的包装类。
您可以在您的 CliHandlers 中始终使用 CliFunctions,它们默认注入。