Slim3からSlim4へのバージョンアップの際のメモ

現在担当している会社のシステムはPHPをSlimを利用している。そのシステムをSlim3からSlim4にバージョンアップした際に調べた事などを折角なのでブログに残しておく

ドキュメント

下記は一通り目を通した

slim4のドキュメント

Slim 4 Documentation - Slim Framework

Upgrade Guide - Slim Framework

3系からの変更点

Slim 4.0.0 released - Slim Framework

slim4チートシート

Slim 4 - Cheatsheet and FAQ | Daniel Opitz

3系から4系への変更点

index.phpの書き方

Slim4のスケルトンが公開されているのでこれを参考にすると良い

Slim-Skeleton/index.php at master · slimphp/Slim-Skeleton · GitHub

コンテナ

  • 標準のDIコンテナがpimpleからphp-diに変更
    • 元々pimpleを継承したSlimのライブラリを使用していたが、それが削除されてphp-diライブラリを使用するようになった
    • http://php-di.org/

ルーティング

Slim3
$container->router->pathFor('xxx')

Slim4
$app = AppFactory::create();
$routeParser = $app->getRouteCollector()->getRouteParser();
$routeParser->urlFor('xxx');
  • ルートの取得方法がRouteCollector経由での取得に変わった
  • ルートオブジェクトの名前が「Slim\Route」から「Slim\Routing\Route」に変更
  • 微妙にgroupの指定の仕方が変わった
# Slim3
$app->group('/test', function () {
    $this->map(['GET'], '/hoge', App\HomeController::class . ':index')->setName('home');
});

# Slim4
$app->group('/test', function (RouteCollectorProxyInterface $group) {
    $group->map(['GET'], '/hoge', App\HomeController::class . ':index')->setName('home');
}); 

エラーハンドラ

ミドルウェア

ミドルウェの実装の仕方が変わった

# Slim3
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
{
    return $next($request, $response);
}

# Slim4
public function __invoke(Request $request, RequestHandler $handler): Response
{
    return $handler->handle($request);
}

twig

php - how to add twig-view in slimframework v4 - Stack Overflow

  • twig連携ライブラリは3.xブランチを使用すると良いがTwigのバージョンをあげる必要が出てくる

GitHub - slimphp/Twig-View at 3.x

Request/Response

  • オブジェクトの変更
    • Slim\Http\Request -> Slim\Psr7\Request
    • Slim\Http\Response -> Slim\Psr7\Response
  • isPost, isGetメソッドの廃止
# Slim3
if ($request->isPost()) {
    xxxx
}

# Slim4
if (strtoupper($request->getMethod()) === 'POST') {
    xxx
}
  • withRedirectメソッドの廃止
# Slim4での書き方
return $response->withHeader('Location', $url)->withStatus(302);
  • withJsonメソッドの廃止
# Slim4での書き方
$response->getBody()->write(json_encode($data));
return $response->withHeader('Content-Type', 'application/json');
  • writeメソッドの呼び出し方法の変更
# Slim3
return $response->withHeader('Content-Type', 'application/octet-stream')->write($data)

# Slim4
$response->getBody()->write($data);
return $response->withHeader('Content-Type', 'application/octet-stream')
  • jsonのPOSTデータの取得方法(暗黙的にjsonデコードされてたのが明示的な変換が必要に)
# Slim3
$data = $request->getParsedBody();

# Slim4
$data = json_decode($request->getBody(), true);

標準middlewareで対応する方法もある https://akrabat.com/receiving-input-into-a-slim-4-application/

例外

  • slimの例外の名称変更
    • NotFoundException -> HttpNotFoundException
  • 引数の変更
# Slim3
throw new NotFoundException($request, $response);

# Slim4
throw new HttpNotFoundException($request);