nyholm / symfony-runtime
使 PHP 应用程序与全局状态解耦
Requires
- php: >=7.2.5
- composer-plugin-api: ^1.0|^2.0
- symfony/polyfill-php80: ^1.15
Requires (Dev)
- composer/composer: ^1.0.2|^2.0
- symfony/console: ^4.4|^5
- symfony/dotenv: ^5.1
- symfony/http-foundation: ^4.4|^5
- symfony/http-kernel: ^4.4|^5
Conflicts
- symfony/dotenv: <5.1
This package is auto-updated.
Last update: 2024-08-23 00:56:00 UTC
README
此存储库是 symfony/symfony#36652 的镜像
Symfony Runtime 使应用程序从全局状态中解耦。
入门指南
$ composer require nyholm/symfony-runtime
RuntimeInterface
该组件的核心是 RuntimeInterface
,它描述了一个高阶运行时逻辑。
它被设计成完全通用,能够在6个步骤中运行任何不依赖全局状态的应用程序
- 你的前端控制器返回一个封装你的应用的闭包;
- 这个闭包的参数通过
RuntimeInterface::resolve()
解决,它返回一个ResolvedAppInterface
。这是一个无参数的可调用对象,它返回你的应用的任何对象(例如,一个 Symfony 内核或响应,一个控制台应用程序或命令); - 调用此可调用对象并返回代表你的应用的该对象;
- 你的应用对象传递给
RuntimeInterface::start()
,它返回一个StartedAppInterface
:一个知道如何“运行”你的应用的可调用对象; - 调用该可调用对象并返回整数退出状态码;
- PHP 引擎使用此状态码退出。
这个过程非常灵活,因为它允许 RuntimeInterface
的实现挂钩到任何关键步骤。
自动加载
此包将自己注册为 Composer 插件以生成 vendor/autoload_runtime.php
文件。您需要在前端控制器中替代常规的 vendor/autoload.php
来要求它,并且返回一个闭包。
在要求 vendor/autoload_runtime.php
文件之前,您可以设置 $_SERVER['APP_RUNTIME']
变量为一个实现了 RuntimeInterface
的类,该类应该用于运行应用程序。
默认使用 SymfonyRuntime
。它知道运行 Symfony 和原生 PHP 应用的约定。
示例
此 public/index.php
是一个处理“name”查询参数的“Hello World”;
<?php require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; return function (array $request, array $context): string { // $request holds keys "query", "data", "files" and "session", // which map to $_GET, $_POST, $_FILES and &$_SESSION respectively // $context maps to $_SERVER $name = $request['query']['name'] ?? 'World'; $time = $context['REQUEST_TIME']; return sprintf('Hello %s, the current Unix timestamp is %s.', $name, $time); };
此 bin/console.php
是一个单命令“Hello World”应用程序(在启动之前运行 composer require symfony/console
)
<?php use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; return function (Command $command) { $command->addArgument('name', null, 'Who should I greet?', 'World'); return function (InputInterface $input, OutputInterface $output) { $name = $input->getArgument('name'); $output->writeln(sprintf('Hello <comment>%s</>', $name)); }; };
SymfonyRuntime
可以解析和处理与 symfony/http-foundation
和 symfony/console
组件相关的许多类型。有关更多信息,请查看其源代码。
资源
- 贡献
- 报告问题 和 发送拉取请求 到 主 Symfony 存储库