發布 Slim 4.0.0-alpha

我們興奮地宣布 Slim 4.0.0 alpha 版本已發布。請將所有此版本的回饋意見傳送至 Slim 4 Alpha 版本回饋討論串。新文件位於 這裡

整體方向

此重大版本著重於下列事項

  • 實作 PSR-15 中間層支援
  • 鬆綁 Slim 對 PSR-7 實作的依賴,並允許使用任何 PSR-7 實作
  • 鬆綁我們對 Pimple 的相依性,並允許使用任何 PSR-11 ContainerInterface 實作
  • 鬆綁我們對 FastRoute 的相依性,並實作介面,使用戶可以使用任何路由函式庫
  • 將錯誤處理與核心鬆綁,並讓使用者輕鬆使用自己的實作
  • 將回應發送與核心鬆綁,並讓使用者輕鬆使用自己的實作
  • 移除所有 特徵,以產生更乾淨的呼叫堆疊追蹤,利於除錯
  • 建立 App 工廠,更容易建立 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 Server、Guzzle PSR-7 和 Guzzle HTTP Factory 以及 Zend-Diactoros)。


變更記錄

新增項目

  • #2642 新增 AppFactory,以啟用 PSR-7 執行和 ServerRequest 建立器的自動偵測。
  • #2641 新增 RouteCollectorProxyInterface,將所有的路由對應功能從 app 提取到其自己的介面中。
  • #2640 新增 RouteParserInterface,並徹底將 FastRoute 路由剖析器與核心分開。方法 relativePathFor()urlFor()fullUrlFor() 現在位於此介面中。
  • #2639 新增 DispatcherInterface,並徹底將 FastRoute 調度器與核心分開。這讓我們有辦法將路由器執行取代為其他路由器。
  • #2638RouteCollector::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 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

已棄用

  • #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 取消套用 $thisRouteGroup callable
  • #2555 雙重中間件支援已被棄用

已移除

  • #2612 移除 Routable,重新設計 RouteGroup 和 Route 介面
  • #2589 完全移除 App::$settings
  • #2587 移除 Pimple 作為 dev 相依性套件
  • #2398 Slim 不再在 App 中內建錯誤處理。請加入 Slim\Middleware\ErrorMiddleware 作為最外層的中間件。
  • #2375 Slim 不再將 default_mimetype 設為空字串,因此您需要自行在 php.ini 或您的 app 中使用 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 實作。若要順利進行自動偵測並讓您可以使用 AppFactory::create()App::run(),而不必手動建立 ServerRequest,您需要安裝下列實作之一

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:Hello World

<?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