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
- マクロ名の変更
- https://github.com/slimphp/Twig-View/tree/3.x#custom-template-functions
- path_for -> url_for
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')
# 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);