mattcolf/flex

Flex 是一个灵活且易于使用的框架。

1.0-alpha1 2017-10-16 02:50 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:48:52 UTC


README

警告:此框架正在积极开发中,尚未准备好用于生产。

这是一个简单且易于使用和扩展的基于栈的框架。Flex 使用 PSR-7 请求和响应,PSR-11 容器以及其他社区库,如 Fast Route、Zend Diactoros、League Container 和 Whoops。

为什么选择 Flex?

Flex 是一个微框架,不会干扰您的操作,并提供了一个最小的包装,使您可以编写简单的框架无关的应用程序代码。路由基于一个简单的应用程序代码栈,它与框架的唯一交互是通过 PSR-7 请求和响应对象。

组件替换

可以通过修改传递给 Flex 的依赖注入容器来替换所有框架组件,以满足应用程序的需求。

容器

待办事项

请求 & 响应

待办事项

路由器

待办事项

找不到 & 不允许控制器

待办事项

错误处理器

待办事项

写入器

待办事项

入门

入门 Flex 就像创建一个 Flux App 实例并调用 run 方法一样简单。如果您不需要修改容器,可以直接调用 App::create() 方法,使用默认容器设置应用程序。

<?php

use MattColf\Flex\App;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

$config = [];
$config['debug'] = true;

$config['routes'] = [
    'index' => [
        'method' => 'GET',
        'path' => '/',
        'stack' => [
            function (ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface
            {
                $response->getBody()->write('<h1>Hello World!</h1>');
               
                return $response;
            }
        ]
    ]
];


$app = App::create($config);
$app->run();

添加路由

在 Flex 中,路由通过 routes 配置键定义。每个 routes 数组条目代表一个路由或一组路由(更多内容见下文),其中键是路由名称,值是以下路由选项的数组。

  • method:此路由应匹配的 HTTP 方法,或方法数组。可以是字符串('GET')或字符串数组(['GET', 'POST'])。必须是有效的 HTTP 方法(GETPOST 等)。
  • path:此路由应匹配的相对路径。应以 / 开始,如 /homepage
  • stack:当路由匹配时应运行的中介件和控制器引用数组。有关详细信息,请参阅下文的栈定义。

分组

当一组路由应具有相同的路径前缀或中介件时,可以对这些路由进行分组以简化配置。分组配置与路由相同,但还具有 routes 选项。

  • path:此组中所有路由必须开始的相对路径。
  • stack:应添加到本组中每个路由的中介件数组。此栈将在每个成员路由的栈之前运行。
  • routes:此组中的路由数组。

请注意,分组可能没有 method 选项。

路由参数

路由路径可以包含参数。当应用程序运行时,这些参数作为数组提供到请求对象的 route_params 属性中。参数包含在路径中,由花括号包裹的字符串。以下是一个示例。

$routes = [
    'user-details' => [
        'method' => 'GET',
        'path' => '/users/{id}',
        'stack' => [
            'user.controller'
        ]
    ]
];

默认情况下,Flex 使用 Fast Route 路由器。有关如何使用路由参数的详细信息,请参阅 文档

栈成员

每个路由的栈定义了当路由匹配时应该运行什么。它由对中间件和控制器函数的引用组成,这些函数使用PSR-7请求和响应对象。

中间件函数

每个栈可以有任意数量的中间件函数。

function (ServerRequestInterface $request, ResponseInterface $response, callable $next) : ResponseInterface
{
    // your code that should run before the rest of the stack
    
    // you are responsible for calling the next item in the stack
    $response = $next($request, $response);
    
    // your code that shiuld run after the rest of the stack
    
    return $response;
}

控制器函数

每个栈必须有一个控制器,该控制器也必须是栈中的最后一个项目。

function (ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface
{
    // your controller code

    return $response;
}

栈引用

Flex使用引用来查找您添加到栈中的每个中间件和控制器函数。这些引用通常是可调用的函数或依赖注入容器中可调用的类的键,但支持更多类型。以下是一些示例。

容器类调用

class Controller
{
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface {
        return $response;
    };
}

$container->set('controller', new Controller());
$reference = 'controller';

容器类方法

class Controller
{
    public function run(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface {
        return $response;
    };
}

$container->set('controller', new Controller());
$reference = 'controller::run';

匿名函数

$reference = function (ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface {
    return $response;
};

对象调用

class Controller
{
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface {
        return $response;
    };
}

$reference = [new Controller()];

对象方法可调用

class Controller
{
    public function run(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface {
        return $response;
    };
}

$reference = [new Controller(), 'run'];

静态方法可调用

class Controller
{
    public function run(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface {
        return $response;
    };
}

$reference = [Controller::class, 'run'];

配置

以下配置值可用。

  • debug
  • routes
  • middleware