laravel5.8でDB周りの処理のリファクタリングをしております。
レポジトリ(インターフェースとレポジトリの二段階)を作成し、ロジックの分離をしようとしているのですが、エラーが解決できずにいます。
・エラー内容(レスポンス内のメッセージ)
"message": "Class App\Repositories\Impression\ImpressionRepositoryInterface does not exist",
エラーを見ると、interfaceがないと言われています。
タイポを疑い、しつこくチェックはしたのですが、解決せず、、、。
以下、実装した手順と資料を書かせていただくので、お気づきの点がありましたらアドバイスをいただけますと幸いです。
・やったこと
①App配下にRepositoriesディレクトリ作成、同ディレクトリ内にinterfaceとrepositoryのファイル作成
②interfaceにはメソッドのみ定義、repositoryで継承してロジックを実装
PHP
1<?php 2 3namespace App\Repositories\Impression; 4 5use Illuminate\Support\Facades\DB; 6 7class ImpressionRepository implements ImpressionRepositoryInterface 8{ 9 protected $table = 'impressions'; 10 11 public function get_public($id) 12 { 13 return DB::table($this->table) 14 ->select('users.name', 'users.img', 'impressions.*') 15 // 非公開(1)の感想は取得しない 16 ->where('impressions.secret', 0) 17 ->where('impressions.book_id', $id) 18 ->join('users', 'impressions.user_id', '=', 'users.id') 19 ->get(); 20 } 21 22 public function get_myImpressions($user_id) 23 { 24 return DB::table($this->table) 25 ->select('users.name', 'users.img', 'impressions.*') 26 // 非公開も含め取得する 27 ->where('impressions.user_id', $user_id) 28 ->join('users', 'impressions.user_id', '=', 'users.id') 29 ->get(); 30 } 31} 32
③ServiceProviderに登録(今回はRepository用のProviderを作成)
PHP
1<?php 2 3namespace App\Providers; 4 5use Illuminate\Support\ServiceProvider; 6 7use App\Repositories\Impression\ImpressionRepositoryInterface; 8use App\Repositories\Impression\ImpressionRepository; 9 10class RepositoryServiceProvider extends ServiceProvider 11{ 12 /** 13 * Register services. 14 * インターフェースとレポジトリの登録 15 * boot(使用)はコントローラ内 16 * @return void 17 */ 18 public function register() 19 { 20 $this->app->bind( 21 // Impression API 22 ImpressionRepositoryInterface::class, 23 ImpressionRepository::class, 24 ); 25 }
④新規作成したServieProviderなので、config/app.phpに登録
'providers' => [ App\Providers\RepositoryServiceProvider::class, ],
⑤config/app.phpを更新するため、キャッシュ更新
php artisan config:cache
⑥コントローラのコンストラクタ内でinterfaceを呼び出し、
PHP
1<?php 2 3namespace App\Http\Controllers\API; 4 5use App\Http\Controllers\Controller; 6use App\Repositories\Impression\ImpressionRepositoryInterface; 7use Illuminate\Http\Request; 8use App\Http\Requests\StoreImpressionsRequest; 9 10class ImpressionController extends Controller 11{ 12 private $impression; 13 14 public function __construct(ImpressionRepositoryInterface $impressionRepositoryInterface) 15 { 16 $this->impression = $impressionRepositoryInterface; 17 } 18 19 /** 20 * Display the specified resource. 21 * 22 * @param int $id 23 * @return \Illuminate\Http\Response 24 */ 25 public function show($id) 26 { 27 $impressions = $this->impression->get_public($id); 28 return response()->json($impressions); 29 }
・参考資料
LaravelでRepositoryパターンを実装する-入門編-
Laravel 6 Advanced - e7 - Repository Pattern(youtube動画)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/25 09:01