Slim 4.0.0-alpha 发布
我们很高兴地宣布 Slim 4.0.0 alpha 版本发行。请将您对本次发布的所有反馈直接发送至 Slim 4 Alpha Release Feedback Thread。新文档位于 此处。
总体方向
对于此重大版本,重点关注以下内容
- 实现 PSR-15 中间件支持
- 分离 Slim 对 PSR-7 实现的依赖性并允许使用任何 PSR-7 实现
- 分离对 Pimple 的依赖性并允许使用任何 PSR-11 ContainerInterface 实现
- 分离对 FastRoute 的依赖性并实现能让用户使用任何路由库的接口
- 从核心代码中分离错误处理,让用户能够轻松使用自己的实现
- 从核心代码中分离响应发送并让用户能够轻松使用自己的实现
- 删除所有特性用于调试时获得更简洁的调用堆栈跟踪
- 创建应用工厂,由于模块化程度提高,使其更易于创建
App
实例
重大更改
- Slim 需要 PHP 7.1 或更高版本才能运行。
- Slim 不再捆绑带有 PSR-7 实现。
- Slim 不再捆绑带有 Pimple。
- Slim 不再将
default_mimetype
设置为空字符串,因此您需要在 php.ini 或应用中通过ini_set('default_mimetype', '')
进行设置。 - Slim
App::$settings
已被移除,多种中间件已被实现以替换各个单独设置中的功能。 - 路由现在通过
Slim\Middleware\RoutingMiddleware
完成。默认情况下,将在中间件队列中最后执行路由。如果您想从$request
中访问route
和routingResults
属性,则需要将该中间件添加为最后一个,因为在运行应用时该中间件首先在队列中被执行。中间件队列仍按后进先出 (LIFO) 的顺序执行。这将取代determineRouteBeforeAppMiddleware
设置。 - 输出缓冲现在通过
Slim\Middleware\OutputBufferingMiddleware
完成。这将取代outputBuffering
设置。 - 现在通过
Slim\Middleware\ContentLengthMiddleware
计算内容长度标头。这将取代addContentLengthHeader
设置。 RouterInterface
组件已分为 4 个接口RouteCollectorInterface
、RouteParserInterface
、RouteResolverInterface
和DispatcherInterface
。- 双重传递中间件已弃用。中间件标记现在是 PSR-15
MiddlewareInterface
标记process(Request $request, RequestHandler $handler)
。我们不再支持双重传递function ($request, $response, $next)
标记。您仍可以使用标记为function (Request $request, RequestHandler $handler) {}
的调用方式创建中间件,或使用具有该标记的可调用类。 - Slim
App
现在实施 PSR-15RequestHandlerInterface
。使用$app->handle($request)
代替$app($request)
。 - PSR-15 RequestHandler 现在可以用作路由可调用方式。
- 已删除
$app
与RouteGroup
可调用方式之间的绑定。相反,将会把RouteCollectorProxy
注入到RouteGroup
的可调用方式中。$app->group('/group', function (RouteCollectorProxy $group) { $group->get(...); }
- 已删除
App::subRequest()
方法。您可以在路由可调用方式中通过$app->handle($request)
执行子请求。 - 已删除
SlimException
。已实施新的HttpException
,包括HttpBadRequestException
、HttpForbiddenException
、HttpInternalServerErrorException
、HttpMethodNotAllowedException
、HttpNotFoundException
、HttpNotImplementedException
和HttpUnauthorizedException
。您还可以通过扩展HttpException
或HttpSpecializedException
创建您自己的异常。 - 用户使用
App::map()
时,请求方法名称现在区分大小写。 - 已删除所有特性。
CallableResolverTrait
和MiddlewareAwareTrait
不再存在。 - 引入了两个新工厂。
AppFactory
和ServerRequestCreatorFactory
以促进App
和ServerRequest
创建。我们目前支持 4 个 PSR-7/ServerRequest 创建者组合(Slim-Psr7、Nyholm PSR-7 和 Nyholm PSR-7 服务器、Guzzle PSR-7 和 Guzzle HTTP 工厂和 Zend-Diactoros)。
更新日志
已添加
- #2642 添加了
AppFactory
以启用 PSR-7 实现和 ServerRequest 创建者自动检测。 - #2641 添加了
RouteCollectorProxyInterface
,它从应用程序中提取所有路由映射功能到其自己的接口中。 - #2640 添加了
RouteParserInterface
,并完全将 FastRoute 路由解析器与核心分离。该方法relativePathFor()
、urlFor()
和fullUrlFor()
现在位于此接口上。 - #2639 添加了
DispatcherInterface
,并完全将 FastRoute 调度程序与核心分离。这使我们能够将路由器实现替换为任何其他路由器。 - #2638 添加了
RouteCollector::fullUrlFor()
,以提供生成完全限定的 URL 的能力 - #2634 添加了在每个路由基础上设置调用策略的能力。
$app->get(...)->setInvocationStrategy($strategy)
- #2555 添加了 PSR-15 中间件支持
- #2529 Slim 不再附带 PSR-7 实现。您需要提供 PSR-7 ServerRequest 和 PSR-17 ResponseFactory 来运行 Slim。
- #2507 方法名在
Router::map()
中现在区分大小写,因此,在扩展中,在 App::map() 中也是如此 - #2497 PSR-15 RequestHandlers 现在可以用作路由回调
- #2496 Slim App 现在可以用作 PSR-15 请求处理程序
- #2405
RoutingMiddleware
现在添加了routingResults
请求属性来保存路由的结果 - #2404 Slim 4 需要 PHP 7.1 或更高版本
- #2425 添加了
$app->redirect()
- #2398 添加了
Middleware\ErrorMiddleware
- #2329 添加了
Middleware\MethodOverrideMiddleware
- #2288 从调度中分离路由
- #2254 添加了
Middleware\ContentLengthMiddleware
- #2166 添加
Middleware\OutputBufferingMiddleware
已弃用
- #2654
RouteParser::pathFor()
和RouteParser::relativePathFor()
已弃用。使用RouteParser::urlFor()
和RouteParser::relativeUrlFor()
- #2641 弃用
RouteCollector::pushGroup()
、RouteCollector::popGroup()
,它们将被RouteCollector::group()
替换 - #2638 弃用
RouteCollector::pathFor()
,它将被RouteCollector::urlFor()
替换,同时保留原始功能 - #2589 移除
App::$settings
- #2560 移除对
$this
的绑定到RouteGroup
可调用对象。 - #2555 双通道中间件支持已弃用
已移除
- #2612 移除 Routable、重构 RouteGroup 和 Route 接口
- #2589 彻底删除
App::$settings
- #2587 移除 Pimple 作为 dev 依赖项
- #2398 Slim 不再在 App 中内置错误处理。将
Slim\Middleware\ErrorMiddleware
作为最外层中间件添加。 - #2375 Slim 不再将
default_mimetype
设置为空字符串,因此需要在 php.ini 或使用ini_set('default_mimetype', '');
在你的应用中自行设置。 - #2288
determineRouteBeforeAppMiddleware
设置已移除。现在需要 RoutingMiddleware() 的地方添加它。 - #2254
addContentLengthHeader
设置已移除 - #2221
Slim\Http
已移除,Slim 现在依赖于独立的 Slim-Http 组件 - #2166
outputBuffering
设置已移除 - #2078 移除
App::subRequest()
- #2098 移除 CallableResolverTrait
- #2102 从路由器移除容器
- #2124 移除
Slim\Exception\SlimException
- #2174 从 Container-Interop 迁移到 PSR-11
- #2290 已移除容器
- #2560 移除
$this
对group()
的绑定
已修复
- #2588 修复
Router::setCacheFile()
的文件/目录权限处理 - #2067 单元测试现已通过 Windows 系统
- #2405 我们在将路径传递给 FastRoute 之前
rawurldecode()
它,所以路径中的 UTF-8 字符现在应该可以正常工作。
逐步详解 Hello World
步骤 1:安装 Composer
还没有 Composer?按照其 下载 页面上的说明进行操作,可以轻松安装。
步骤 2:安装 Slim
我们建议你使用 Composer 安装 Slim。导航至项目根目录,然后执行下面显示的 bash 命令。此命令会将 Slim Framework 及其第三方依赖下载到项目 vendor/
目录中。
composer require slim/slim "^4.0"
步骤 3:安装 PSR-7 实现和 ServerRequest 创建程序
在你使用 Slim 之前,你需要选择一个最适合你应用程序的 PSR-7 实现。为使自动检测正常工作并使你能够在无需手动创建 ServerRequest
的情况下使用 AppFactory::create()
和 App::run()
,你需要安装以下实现之一
Slim PSR-7
composer require slim/psr7
Nyholm PSR-7 和 Nyholm PSR-7 Server
composer require nyholm/psr7 nyholm/psr7-server
Guzzle PSR-7 和 Guzzle HTTP Factory
composer require guzzlehttp/psr7 http-interop/http-factory-guzzle
Zend Diactoros
composer require zendframework/zend-diactoros
步骤 4:HelloWorld
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->get('/', function (Request $request, Response $response, $args) {
$response->getBody()->write("Hello world!");
return $response;
});
$app->run();
Slim 4 DDD 骨架
@l0gicgate 创建了一个采用 DDD 样式的目录结构、示例文件和测试覆盖的应用程序骨架。它非常固执己见,我们还不确定它是否适合作为骨架,但我们想征求一些反馈。你可以克隆此骨架并试用一下
git clone https://github.com/l0gicgate/Slim-Skeleton.git
git checkout 4.x