nyholm/symfony-runtime

使 PHP 应用程序与全局状态解耦

安装: 9

依赖: 0

建议: 0

安全性: 0

星级: 6

关注者: 4

分支: 0

开放问题: 0

类型:composer-plugin

dev-master / 5.2.x-dev 2020-07-22 15:30 UTC

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个步骤中运行任何不依赖全局状态的应用程序

  1. 你的前端控制器返回一个封装你的应用的闭包;
  2. 这个闭包的参数通过 RuntimeInterface::resolve() 解决,它返回一个 ResolvedAppInterface。这是一个无参数的可调用对象,它返回你的应用的任何对象(例如,一个 Symfony 内核或响应,一个控制台应用程序或命令);
  3. 调用此可调用对象并返回代表你的应用的该对象;
  4. 你的应用对象传递给 RuntimeInterface::start(),它返回一个 StartedAppInterface:一个知道如何“运行”你的应用的可调用对象;
  5. 调用该可调用对象并返回整数退出状态码;
  6. 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-foundationsymfony/console 组件相关的许多类型。有关更多信息,请查看其源代码。

资源