
こんにちは。よっしーです(^^)
今日は、slim用のローカル開発環境にRedisを導入する方法についてご紹介します。
前提
この記事は下記の記事をベースにしています。
背景
slimで開発しているRESTful APIでRedisを利用するために、Redisを導入する方法についてご紹介します。
修正内容
下記のファイルを修正追加します。各ファイルの修正内容は各セクションに記載しています。
new file: app/redis/Dockerfile
modified: app/compose.yml
modified: app/php-fpm/Dockerfile
modified: app/php-fpm/slim_app/app/dependencies.php
modified: app/php-fpm/slim_app/app/routes.php
modified: app/php-fpm/slim_app/app/settings.php
app/redis/Dockerfile
下記の内容で新規作成します。
FROM redis:7.0.11-alpine
app/compose.yml
30行目に追加します。
+ redis:
+ build: ./redis
+ container_name: redis
+ ports:
+ - "6379:6379"
+ networks:
+ - net
app/php-fpm/Dockerfile
7行目に追記します。
+# apt-get update & install
+RUN apt-get update
+
+RUN pecl install redis \
+ && docker-php-ext-enable redis
app/php-fpm/slim_app/app/dependencies.php
29行目に追記します。
+ Redis::class => function (ContainerInterface $c) {
+ $settings = $c->get(SettingsInterface::class);
+
+ $redisSettings = $settings->get('redis');
+
+ $redis = new Redis();
+ $redis->connect($redisSettings['host'], $redisSettings['port']);
+ return $redis;
+ },
app/php-fpm/slim_app/app/routes.php
27行目に追記します。
+ $app->get('/testredis', function (Request $request, Response $response) {
+ $key = 'key_dummy';
+ $redis = $this->get(Redis::class);
+ if (!$redis->exists($key)) {
+ $redis->set($key, mt_rand(), ['ex'=>10]);
+ }
+ $value = $redis->get($key);
+ $response->getBody()->write($value);
+ return $response;
+ });
app/php-fpm/slim_app/app/settings.php
24行目に追記します。
+ 'redis' => [
+ 'host' => 'redis',
+ 'port' => 6379,
+ ],
動作確認
下記のコマンドを実施します。
make setup
make up
ブラウザから「http://localhost:8080/testredis」にアクセスして、下図のように表示されていれば成功です。

解説
app/php-fpm/slim_app/app/dependencies.php
このコードは、Redisを使用するための依存性注入(Dependency Injection)の設定を行っています。
コードの内容を詳しく解説すると以下の通りです:
Redis::class => function (ContainerInterface $c):- この行は、
Redisクラスのインスタンスを生成するための関数を設定しています。 - この関数は、引数として
ContainerInterface型のオブジェクト$cを受け取ります。
- この行は、
$settings = $c->get(SettingsInterface::class):- この行では、
$cからSettingsInterface::classを取得しています。 - これは、設定情報を管理するためのインターフェース
SettingsInterfaceの実装クラスのインスタンスを取得しています。
- この行では、
$redisSettings = $settings->get('redis'):SettingsInterfaceのインスタンス$settingsを使用して、キーが'redis'の設定情報を取得しています。- これにより、Redisの接続設定情報を取得することができます。
$redis = new Redis():- 新しい
Redisクラスのインスタンス$redisを作成しています。
- 新しい
$redis->connect($redisSettings['host'], $redisSettings['port']):$redisSettingsから取得したホストとポート情報を使用して、Redisに接続しています。connect()メソッドは、Redisサーバーに接続するためのメソッドです。
return $redis:- Redisの接続が確立された後、この関数は作成された
$redisインスタンスを返します。
- Redisの接続が確立された後、この関数は作成された
このコードは、依存性注入コンテナ(Dependency Injection Container)の設定部分の一部です。この設定により、Redisクラスを必要とする他のコンポーネントやクラスで、この関数を使用してRedisのインスタンスを取得できます。また、SettingsInterfaceを実装したクラスのインスタンスも必要です。これにより、Redisの接続設定情報を取得できます。
依存性注入を使用することで、コードの柔軟性やテスト容易性が向上します。また、Redisの接続設定を変更する場合にも、この設定部分のみを変更すれば済むため、変更の影響範囲を限定することができます。
app/php-fpm/slim_app/app/routes.php
このコードは、Slim Frameworkを使用して作成されたWebアプリケーションのルートエンドポイント(/testredis)を定義しています。
コードの内容を詳しく解説すると以下の通りです:
$app->get('/testredis', function (Request $request, Response $response):/testredisというパスに対してGETリクエストが送信された場合に、以下の関数が実行されるように設定しています。- この関数は、引数として
Requestオブジェクトのインスタンス$requestとResponseオブジェクトのインスタンス$responseを受け取ります。
$key = 'key_dummy':- Redisのキーとして使用するダミーのキー名
'key_dummy'を変数$keyに代入しています。
- Redisのキーとして使用するダミーのキー名
$redis = $this->get(Redis::class):- 依存性注入コンテナから
Redis::class(Redisのインスタンス)を取得し、変数$redisに代入しています。 - これにより、このルートハンドラ内でRedisにアクセスできるようになります。
- 依存性注入コンテナから
if (!$redis->exists($key)) { ... }:- Redisの
exists()メソッドを使用して、キーが存在するかどうかをチェックしています。 - もしキーが存在しない場合(
exists()の戻り値がfalseの場合)、以下の処理が実行されます。
- Redisの
$redis->set($key, mt_rand(), ['ex'=>10]):- Redisの
set()メソッドを使用して、キーとランダムな値をRedisに設定しています。 - 第3引数の連想配列
['ex'=>10]は、キーの有効期限を10秒に設定するためのオプションです。
- Redisの
$value = $redis->get($key):- Redisの
get()メソッドを使用して、指定したキーの値を取得し、変数$valueに代入しています。
- Redisの
$response->getBody()->write($value):- レスポンスオブジェクト
$responseのボディに、Redisから取得した値を書き込んでいます。
- レスポンスオブジェクト
return $response:- 処理が完了したレスポンスオブジェクト
$responseを返します。
- 処理が完了したレスポンスオブジェクト
このコードは、/testredisへのGETリクエストに対して、Redisを使用してダミーのキーと値を設定し、それをレスポンスとして返すエンドポイントです。存在しないキーの場合は、ランダムな値をキーに設定して有効期限を10秒に設定します。存在するキーの場合は、そのキーの値を取得してレスポンスとして返します。
おわりに
今日は、slim用のローカル開発環境にRedisを導入する方法についてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)



コメント