記事で、Laravelでのリポジトリパターンについて、その基本動作について書きました。今回はより実践的な使い方でRepositoryパターンを実装していきます。開発環境については以下の通りです。3.7Laravelのルートディレクトリを「laravel/」としています。SQLiteの導入についてはLaravelとSQLiteを用いた開発環境とデータソースを用意するを参照してください。今顔は「書籍の一覧を返す」という動作を、Repositoryパターンを使って実装していきます。大まかな流れや条件などを考え、必要なクラスなどをプチ設計しておきます。書籍のリストを返却する単体の書籍クラス(Book)複数の書籍クラスから成る書籍リストクラス(BookList)書籍を司るサービスクラスが一連の操作(ビジネスロジック)を担う(BookService)ストレージは2つ。これをRepositoryパターンで切り替え可能にする。MySQL(BookMysqlRepository)SQLite(BookSqliteRepository)データ構造についてbooksテーブルとauthorsテーブルがあり、リスト取得の際にauthorの名前を結合して取得するこんなところでしょうか。これを基にして実装を行っていきます。ディレクトリの構造については各々のポリシーの上自由に配置してもらえればと思うのでここでは特に拘って設置はしていません。実装それでは実装していきます。リポジトリパターンの前に細々したものを定義していきます。最小単位である、単体の「書籍」を表現する書籍クラスです。}}書籍リストを表現する書籍リストクラスです。}}リストを取得したらループで回したいのでIteratorAggregateインターフェースを実装しています。getIterator()でArrayIteratorオブジェクトを返却しています。Eloquentを使用するのでモデルを定義します。}}Authorモデルに対して多対1のリレーションを定義しています。}}BooKモデルに対して1対多のリレーションを定義しています。リポジトリパターンの実装ここから、リポジトリパターンの実装になります。このサービスクラスにリポジトリの仕様が追従出来るように、インターフェースを定義します。getList();}つまるところ、「Bookのリポジトリとして認めてもらいたければこの実装を遵守しな!」と高らかに宣言している。そんなインターフェースになります。次に、MySQLとSQLiteそれぞれのリポジトリの具象クラスを定義していきます。}}2つのリポジトリクラスは、各々BookDataAccessインターフェースを実装している点がポイントです。彼らはBookのリポジトリとして認めてもらいたいので、上層の仕様に忠実に従っています。結果論ですが実はこの2つのクラス、connectionメンバ変数以外は記述が全く同じです。まとめてしまっても良いかなと思います。今回はわかりやすいように別々のままにしています。リポジトリクラスが作成できたら、これらをサービスプロバイダへ登録し切り替えられるようにします。一連の実装が完了したので、これらを利用していきます。リポジトリを利用するサービスクラスです。}}リポジトリをコンストラクタインジェクションにて注入しています。サービスプロバイダでアクティブにしたリポジトリがここで自動的に解決されて注入されます。サービスクラスもDIして使うので、これもサービスプロバイダへ登録します。App\Providers\BookServiceProvider::class,],最後に、コントローラからサービスクラスを使用します。}}取得したリストをループで処理したり、ビューに投げたりはおまかせです。'BookListController@index');動作確認すべての実装が完了したので、ブラウザからアクセスして出力を確認してみます。MySQLリポジトリを使用した場合です。)次に、サービスプロバイダから使用するリポジトリをSQLiteリポジトリへ切り替えて再度出力してみます。});}出力結果は以下になります。)データソースが切り替わり、それぞれからデータを取得できた事が確認できました。まとめ以上で作業は終了です。リポジトリパターンを実装する際には依存の方向を逆転させ、あくまでも下層が上層に従うようにしていく(上層に配置したインターフェースに下層のリポジトリが従う)事がポイントです。どちらのリポジトリを使用しても同じ処理で流れていけるように、返されるもののフォーマットもしっかり揃えていく事も大切(双方のリポジトリで返ってくる形式や項目が違うのではそもそも使えない)です。BookmarkLINELaravelでRepositoryパターンを実装する-入門編-LaravelでSlack通知を実装する~ソーシャルではなく開発者/管理者としてのSlack通知~Laravelのサービスコンテナで依存性注入(DI)を行うLaravelでRedisを使う入門編。SESを使ってAPIメール送信を行う(Mailableクラス&SimpleEmailService)2019.12.3MySQL8.0.16で追加されたCHECK制約を試してみる。RitoLaboこのサイトについて利用規約プライバシーポリシ。