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

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

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

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

Q&A

解決済

2回答

1577閲覧

[Laravel]1つのインターフェースに複数の実装を紐づけられるのか

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel 5

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

0グッド

0クリップ

投稿2018/06/03 05:54

■環境
Laravel:5.6
PHP:7.1

■概要
サービスプロバイダーにて、単一のコントローラ内で、
1つのインターフェースに複数の実装を紐づけたいのですが、可能なのでしょうか。
どうしてもインターフェースと実装が1対1にしかならず、困っています。

■構成概要
インターフェース:UserRepositoryInterface

実装クラス:
・UserRepository
・TempUserRepository

php

1class UserRepository implements UserRepositoryInterface 2{ 3 ・・・ 4}

php

1class TempUserRepository implements UserRepositoryInterface 2{ 3 ・・・ 4}

下記のようにできるか試してみましたが、
後に書いたTempUserRepositoryが実装として紐づけられました。
何か方法があるのなら、教えていただきたいです。

php

1<?php 2 3・・・ 4 5public function register() 6{ 7 $this->app->bind( 8 \App\Repositories\UserRepositoryInterface::class, 9 \App\Repositories\UserRepository::class 10 ); 11 12 $this->app->bind( 13 \App\Repositories\UserRepositoryInterface::class, 14 \App\Repositories\TempUserRepository::class 15 ); 16} 17

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/03 08:12

動物(INTERFACE)として キリンは動物です。 クマは動物です。 ウマは動物です。
guest

回答2

0

既にBA付いていますが、参考までにmakewithを使って実装を使う分ける方法もあります。
参考サイト

使用例
呼び出し側

php

1$hoge = \App::makeWith(HogeInterFace::class,['fuga'=>'1']);//この時にはFugafugaを注入したい 2$hoge->methodA();

Provider側

php

1$this->app->bind( 2 HogeInterFace::class, 3 function ($app,$hoge){ 4 //ここで注入するClassを分岐させる。 5 if($hoge['fuga']==='1'){ 6 $bindClass = FugaFuga::class; 7 }else{ 8 $bindClass = Hogehoge::class; 9 } 10 return $app->make($bindClass); 11 });

投稿2018/06/04 02:44

motuo

総合スコア3027

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

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

0

ベストアンサー

TempUserRepositoryInterfaceを作るか、
コントローラーを分けてコンテキストによる結合で解決する。
https://readouble.com/laravel/5.6/ja/container.html#contextual-binding

実装方法に迷うならコントローラーが複雑化してる証拠なのでさっさと分ける。

投稿2018/06/03 08:01

kawax

総合スコア10377

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問