發佈 Slim 4.0.0

我們很高興宣布發佈 Slim 4.0.0。請將針對本版本的回饋全部傳送至 Slim 4 發佈回饋串。新的文件位於 這裡

Build Status Coverage Status

支援 PSR-7 實作 CI 狀態

  • Slim Slim PSR-7
  • Nyholm Nyholm
  • Guzzle Guzzle
  • Zend Zend

注意:Travis-CI 已設定為至少每 24 小時自動觸發一次。

一般方向

對於此重大發佈,重點放在以下事項

  • 實作 PSR-15 中介軟體支援
  • 解除 Slim 對 Slim 的 PSR-7 實作的依賴,並啟用任何 PSR-7 實作
  • 解除 Slim 對 Pimple 的依賴,並啟用任何 PSR-11 ContainerInterface 實作
  • 解除 Slim 對 FastRoute 的依賴,並實作讓使用者能使用任何路由程式庫的介面
  • 解除錯誤處理與核心,讓使用者能輕鬆使用自己的實作
  • 解除回應發射與核心,讓使用者能輕鬆使用自己的實作
  • 移除所有特色,以在除錯時提供更簡潔的呼叫堆疊追蹤
  • 建立 app 工廠,讓建立 App 執行個體變得更加容易,藉此提高模組化

主要變更

  • Slim 需要 PHP 7.1 或更高版本。
  • Slim 不再提供 PSR-7 實作。
  • Slim 不再提供 Pimple。
  • Slim 不再將 default_mimetype 設定為空字串,所以你必須自己使用 ini_set('default_mimetype', '') 在 php.ini 或你的 app 中設定它。
  • Slim App::$settings 已被移除,已實作多個中介軟體來取代個別設定的功能。
  • 路由現在透過 Slim\Middleware\RoutingMiddleware 進行。預設情況下,路由將在中間件佇列中最後執行。如果您想存取 $request 中的 routeroutingResults 屬性,您需要將此中間件放在最後,如此一來,執行應用程式時,它將會在佇列中優先執行。中間件佇列仍依後進先出 (LIFO) 的順序執行。這會取代 determineRouteBeforeAppMiddleware 設定。
  • 輸出緩衝現在透過 Slim\Middleware\OutputBufferingMiddleware 進行。這會取代 outputBuffering 設定。
  • 內容長度標頭計算現在透過 Slim\Middleware\ContentLengthMiddleware 進行。這會取代 addContentLengthHeader 設定。
  • RouterInterface 元件已拆分成 4 個介面 RouteCollectorInterfaceRouteParserInterfaceRouteResolverInterfaceDispatcherInterface
  • Double-Pass 中間件已被棄用。中間件簽章現在是 PSR-15 MiddlewareInterface 簽章 process(Request $request, RequestHandler $handler)。我們不再支援 double-pass 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() 時,請求方法名稱現在會區分大小寫。
  • 所有特質 (Trait) 都已被移除。 CallableResolverTraitMiddlewareAwareTrait 不再存在。
  • 引入了兩個新的工廠。 AppFactoryServerRequestCreatorFactory 以促進建立 AppServerRequest。我們目前支援 4 個 PSR-7/ServerRequest creator 組合 (Slim-Psr7、Nyholm PSR-7 和 Nyholm PSR-7 Server、Guzzle PSR-7 和 Guzzle HTTP Factory 以及 Zend-Diactoros。


更新記錄

4.0.0 - 2019-08-01

已新增

  • #2765 簡化內部中介軟體 ErrorMiddlewareRoutingMiddleware 的排隊。
  • #2759 新增 RouteContext 以允許多元存取目前的路線、路線解析器和路由結果。
  • #2751 新增在 ErrorHandler 元件上設定預設錯誤渲染內容類型的功能。
  • #2737 通過 ErrorRendererInterface 變更為使用可呼叫模式來利用 CallableResolver 而進行 BC 變更。
  • #2734 新增對內容類型基礎錯誤渲染器和設定預設錯誤渲染器的支援。
  • #2716 當程式庫在作用範圍內時,新增 Slim-Http Request/Response 自動佈景。
  • #2654 RouteParser::pathFor()RouteParser::relativePathFor() 已被標記為不建議使用。請使用 RouteParser::urlFor()RouteParser::relativeUrlFor()
  • #2642 新增 AppFactory 以啟用 PSR-7 實作和 ServerRequest creator 自動偵測。
  • #2641 新增 RouteCollectorProxyInterface 以從應用程式中萃取出所有路線對應功能至其自己的介面中。
  • #2640 新增 RouteParserInterface,並將 FastRoute 路由分析器完全從核心區隔開。方法 relativePathFor()urlFor()fullUrlFor() 現在位於此介面
  • #2639 新增 DispatcherInterface,並將 FastRoute 分派器完全從核心區隔開。這讓我們可以將路由實作替換為任何其他路由
  • #2638 新增 RouteCollector::fullUrlFor() 以提供產生完整合格 URL 的功能
  • #2634 新增針對每個路由設定呼叫策略的功能
  • #2555 新增 PSR-15 中介軟體支援
  • #2529 Slim 不再隨附 PSR-7 實作。您需要提供 PSR-7 ServerRequest 和 PSR-17 ResponseFactory 來執行 Slim
  • #2507 Router::map() 中的方法名稱現在區分大小寫,因此「App::map()」也區分大小寫
  • #2497 PSR-15 RequestHandler 現在可用作路由 callable
  • #2496 Slim App 現在可用作 PSR-15 Request Handler
  • #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

已棄用

  • #2641 棄用 RouteCollector::pushGroup()RouteCollector::popGroup(),由 RouteCollector::group() 取代
  • #2638 棄用 RouteCollector::pathFor(),由 RouteCollector::urlFor() 取代,並保留原有功能
  • #2555 雙重通道中介軟體支援已棄用

已移除

  • #2612 Remove Routable,重構 RouteGroup 和 Route 介面
  • #2589 Remove App::$settings
  • #2587 將 Pimple 移出開發依賴項
  • #2398 Slim 不再內建於 App 中處理錯誤。新增 ErrorMiddleware() 作為最外層的 middleware
  • #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 移除了 container。請使用 App::setContainer() 設定您自己的
  • #2560 移除了 $this 對 group() 的繫結

變更

  • #2104 設定為 App::__construct() 中最上層的陣列元素

修復

  • #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 執行。為了讓自動偵測功能發揮作用,並且使用 AppFactory::create()App::run() 而不用手動建立 ServerRequest,你必須安裝以下的執行之一

Slim PSR-7

composer require slim/psr7

Nyholm PSR-7Nyholm PSR-7 伺服器

composer require nyholm/psr7 nyholm/psr7-server

Guzzle PSR-7Guzzle HTTP 工廠

composer require guzzlehttp/psr7 http-interop/http-factory-guzzle

Zend Diactoros

composer require zendframework/zend-diactoros

步驟 4:你好,世界

<?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 風格目錄結構、範例檔案和測試範圍的應用程式架構。它見仁見智且我們也不確定這種架構是否適合一個 Skeleton,但我們想要一些反饋訊息。你可以複製這個架構並試用看看

git clone https://github.com/l0gicgate/Slim-Skeleton.git
git checkout 4.x


Slim 4 MVC 架構

@adriansuter 創建了一個 MVC 架構。你可以複製這個架構並試用看看

git clone https://github.com/adriansuter/Slim4-Skeleton.git