質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

1385閲覧

[laravel]レポジトリをコントローラー内で使う方法

marutto

総合スコア32

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2020/01/25 07:37

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動画)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ざっと見ても問題は見つからなかったので

  • エラーメッセージがどこで出てるか確認。
  • PhpStorm等IDEを使ってtypo確認。
  • composer updateしてみる。単に新しく作ったファイルだから見えてないだけかも。まれにある。

その他。
開発中は最初からキャッシュしなければphp artisan config:cacheは不要。
なぜか開発中にキャッシュして余計なミスしてる人多いけどキャッシュするのは本番用。
php artisan config:clearで消していい。

投稿2020/01/25 08:02

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marutto

2020/01/25 09:01

アドバイスありがとうございます! composer update composer dump-autoload を試したところ、無事解決できました! キャッシュについてもご指摘ありがとうございます。 仰るとおり、過去にキャッシュが原因で詰まったことがありましたので、 開発中は削除していくことにします。 ありがとうございました!
guest

0

php

1 public function __construct(ImpressionRepository $impressionRepository) 2 { 3 $this->impression = $impressionRepository; 4 }

インターフェイスは インスタンスにできないのでこうだと思うけど

投稿2020/01/25 07:41

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawax

2020/01/25 07:54

interfaceでもいい。というかこれこそLaravel最大の特徴。
退会済みユーザー

退会済みユーザー

2020/01/25 07:56

@kawax さん ありがとうございます。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問