mattcolf / flex
Flex 是一个灵活且易于使用的框架。
Requires
- php: ^7.1
- filp/whoops: ^2.1
- league/route: ^3.0
- nikic/fast-route: ^1.2
- psr/container: ^1.0
- psr/http-message: ^1.0
- psr/log: ^1.0
- symfony/dotenv: ^3.3
- zendframework/zend-diactoros: ^1.6
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^6.4
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 方法(GET
、POST
等)。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