こんにちは。よっしーです(^^)
今日は、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を導入する方法についてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント