問題点
Slim Framework のミドルウェアは PSR-7 を採用していますので、行き方向(リクエスト向)と帰りの方向(レスポンス向)で、自由に処理を書けます。
ところが、行き方向でDBを扱った処理を書いたところ、
Fatal error: Call to a member function connection() on null in ~
といったエラーが出力されてしまいました。
試しに、帰りの方向(レスポンス向)にも全く同じ処理を書いたところ、こちらではDB接続が出来ました。
DIコンテナに illuminate/database を設定しているのですが、どうもリクエスト処理が完了してからDB接続処理が走っているような感じですね。
以下ソースのイメージです。
... $app->add( function ($request, $response, $next) { // 行き方向(リクエスト向) $users = new \App\Models\users; log( $users->count() ); // DB接続エラーになる // 次のミドルウェアへ送る $response = $next($request, $response); // 帰り方向(レスポンス向) $users = new \App\Models\users; log( $users->count() ); // 正常にusersテーブルのカウント数が返る // 前のミドルウェアへ返す return $response; } ); ...
解決法
そこで、以下のような2行を書くと、先にDB接続が実行されて、行き方向でもDB処理が正常に実行されましたので、ここに記載します。
... $app->add( function ($request, $response, $next) { // DB接続実行 global $container; $container->db; // 行き方向(リクエスト向) $users = new \App\Models\users; log( $users->count() ); // 正常にusersテーブルのカウント数が返るようになった! // 次のミドルウェアへ送る $response = $next($request, $response); // 帰り方向(レスポンス向) $users = new \App\Models\users; log( $users->count() ); // 正常にusersテーブルのカウント数が返る // 前のミドルウェアへ返す return $response; } ); ...
スーパーグローバル使って $GLOBALS['container']->db;
1行でもいいですけどね。
ご注意
Slim Framework のマニュアルやソースを読み込んだわけではないので、これが間違いのない方法かは不明ですので、自己責任でご参考いただければと思います。