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 中访问 routeroutingResults 属性,则需要将该中间件添加为最后一个,因为在运行应用时该中间件首先在队列中被执行。中间件队列仍按后进先出 (LIFO) 的顺序执行。这将取代 determineRouteBeforeAppMiddleware 设置。
  • 输出缓冲现在通过 Slim\Middleware\OutputBufferingMiddleware 完成。这将取代 outputBuffering 设置。
  • 现在通过 Slim\Middleware\ContentLengthMiddleware 计算内容长度标头。这将取代 addContentLengthHeader 设置。
  • RouterInterface 组件已分为 4 个接口 RouteCollectorInterfaceRouteParserInterfaceRouteResolverInterfaceDispatcherInterface
  • 双重传递中间件已弃用。中间件标记现在是 PSR-15 MiddlewareInterface 标记 process(Request $request, RequestHandler $handler)。我们不再支持双重传递 function ($request, $response, $next) 标记。您仍可以使用标记为 function (Request $request, RequestHandler $handler) {} 的调用方式创建中间件,或使用具有该标记的可调用类。
  • Slim App 现在实施 PSR-15 RequestHandlerInterface。使用 $app->handle($request) 代替 $app($request)
  • PSR-15 RequestHandler 现在可以用作路由可调用方式。
  • 已删除 $appRouteGroup 可调用方式之间的绑定。相反,将会把 RouteCollectorProxy 注入到 RouteGroup 的可调用方式中。 $app->group('/group', function (RouteCollectorProxy $group) { $group->get(...); }
  • 已删除 App::subRequest() 方法。您可以在路由可调用方式中通过 $app->handle($request) 执行子请求。
  • 已删除 SlimException。已实施新的 HttpException,包括 HttpBadRequestExceptionHttpForbiddenExceptionHttpInternalServerErrorExceptionHttpMethodNotAllowedExceptionHttpNotFoundExceptionHttpNotImplementedExceptionHttpUnauthorizedException。您还可以通过扩展 HttpExceptionHttpSpecializedException 创建您自己的异常。
  • 用户使用 App::map() 时,请求方法名称现在区分大小写。
  • 已删除所有特性。 CallableResolverTraitMiddlewareAwareTrait 不再存在。
  • 引入了两个新工厂。AppFactoryServerRequestCreatorFactory 以促进 AppServerRequest 创建。我们目前支持 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 移除 $thisgroup() 的绑定

已修复

  • #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-7Nyholm PSR-7 Server

composer require nyholm/psr7 nyholm/psr7-server

Guzzle PSR-7Guzzle 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