teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

7

経緯の追加 コードをより実装に近い形に変更

2019/11/15 08:57

投稿

Mao_3309
Mao_3309

スコア5

title CHANGED
File without changes
body CHANGED
@@ -1,42 +1,120 @@
1
- ### 前提・実現したいこと
1
+ ### 前提
2
+ 前提条件としてすでに 1つのモジュール(以下の例で BModule)はすでに実装されております。
3
+ モジュールは API(REST 通信)にて情報を取得し、後続処理でそのデータを使用します。
4
+ 今後別の APIプログラムにアクセスする CModule を実装を予定しており、
5
+ それはユーザーの情報によって切り替える必要があります。
2
6
 
7
+ 既存の処理を変更したくないため、サービスコンテナを切り替えることで、新たなモジュール
3
- Laravel で Webアプリケーション作成しています。
8
+ 「CModule」実装たいと考えています。
4
- とあるモジュールをDBに登録されている情報でハンドリングしたいと考えています。
5
9
 
10
+ ### 実現したいこと
11
+
6
12
  通常はサービスプロバイダーで行うとと思いますが、リクエストパラメーターを使用したDBアクセスを伴うためコントローラーで行いたいです。
7
13
  そのような方法は可能でしょうか?
8
14
 
15
+ ### 現状の実装
16
+ 完全なプログラムを公開することはできないため、一部加工してあります。
17
+
9
- #### インターフェイスを作成します。
18
+ #### インターフェイス
10
19
  ```
11
20
  namespace App\Modules;
12
21
 
13
- interface Ia {
22
+ interface ModuleBase {
14
23
  public function getData();
24
+ public function getPath();
25
+ public function getItem();
26
+
15
- }
27
+ //その他複数のメソッド
16
28
  ```
17
29
 
18
- #### 作成したインターフェイスを継承する 2つのモジュールを作成します。
30
+ #### 作成したインターフェイスを継承する 2つのモジュール
19
31
  ```
20
32
  namespace App\Modules;
21
33
 
22
- class B implements Ia {
34
+ class BModule implements ModuleBase {
35
+ private $data;
23
36
  public function getData(){
37
+ $url = 'https://b.xxxxx.xxx/api/xxx';
38
+ $client = new \GuzzleHttp\Client();
39
+ $response = $client->request(
24
- return 'B';
40
+ 'POST',
41
+ $url,
42
+ ['key' => 'xxxxxxx']
43
+ );
44
+ $this->data = $response->getBody();
25
45
  }
46
+ public function getPath(){
47
+ return $this->data['path'];
26
- }
48
+ }
49
+ public function getItem(){
50
+ return $this->data['item'];
51
+ }
52
+
53
+ //その他複数のメソッド
54
+
27
55
  ```
28
56
 
29
57
  ```
30
58
  namespace App\Modules;
31
59
 
32
- class C implements Ia {
60
+ class CModule implements ModuleBase {
33
61
  public function getData(){
62
+ $url = 'https://c.xxxxx.xxx/api/xxx';
63
+ $client = new \GuzzleHttp\Client();
64
+ $response = $client->request(
34
- return 'C';
65
+ 'POST',
66
+ $url,
67
+ ['key' => 'xxxxxxx', 'user' => 'xxxxxx']
68
+ );
69
+ $this->data = $response->getBody();
35
70
  }
71
+ public function getPath(){
72
+ $res = implode('/', $this->data['path'])
73
+ return $res;
74
+ }
75
+ public function getItem(){
76
+ return $this->data['item'];
77
+ }
78
+
79
+ //その他複数のメソッド
80
+
81
+ ```
82
+
83
+ #### 既存処理である BModule はサービスコンテナに登録されている
84
+ ```
85
+ namespace App\Providers;
86
+
87
+ use Illuminate\Support\ServiceProvider;
88
+
89
+ class AppServiceProvider extends ServiceProvider
90
+ {
91
+ /**
92
+ * Bootstrap any application services.
93
+ *
94
+ * @return void
95
+ */
96
+ public function boot()
97
+ {
98
+ //
99
+ }
100
+
101
+ /**
102
+ * Register any application services.
103
+ *
104
+ * @return void
105
+ */
106
+ public function register()
107
+ {
108
+ $this->app->bind(
109
+ 'App\Modules\ModuleBase',
110
+ 'App\Modules\BModule'
111
+ );
112
+ }
36
113
  }
114
+
37
115
  ```
38
116
 
39
- #### これをコントローラーでサービスコンテナ登録する方法を確認したいです。
117
+ #### 既存処理 BModule をコントローラーで CModule 切り替えたい
40
118
  ```
41
119
  namespace App\Http\Controllers;
42
120
 
@@ -48,17 +126,17 @@
48
126
  {
49
127
  public function index(Request $request)
50
128
  {
51
- $id = $request->input('item_id');
129
+ $id = $request->input('user_id');
52
- $item = \App\Item::find($id);
130
+ $user = \App\User::find($id);
53
131
 
54
- if($item->status == 1){
132
+ if($user->apiStatus == 1){
55
- //■■ここで IaC をバインドする方法が知りたいです。■■
133
+ //■■ここで ModuleBaseCModule をバインドする方法が知りたいです。■■
56
134
 
57
135
  }
58
- $ia = App::make(App\Modules\Ia::class);
136
+ $api = App::make(App\Modules\ModuleBase::class);
59
- $ia->getData();//C
137
+ $api->getData();
138
+
60
- }
139
+ //これ以降にも「App::make(App\Modules\ModuleBase::class)」を使用してデータを取得する処理があります。
61
- }
62
- ```
140
+ //既存の処理を変更したくないため、サービスコンテナで切り替えたいと考えております。
63
141
 
64
- このような使い方自体がアンチパターンの場合はご指摘ください。
142
+ ```

6

誤字

2019/11/15 08:57

投稿

Mao_3309
Mao_3309

スコア5

title CHANGED
File without changes
body CHANGED
@@ -3,7 +3,7 @@
3
3
  Laravel で Webアプリケーションを作成しています。
4
4
  とあるモジュールをDBに登録されている情報でハンドリングしたいと考えています。
5
5
 
6
- 通常はサービスプロバイダーで行うとと思いますが、リクエストパラメーターを使用したDBアクセス伴うためコントローラーで行いたいです。
6
+ 通常はサービスプロバイダーで行うとと思いますが、リクエストパラメーターを使用したDBアクセス伴うためコントローラーで行いたいです。
7
7
  そのような方法は可能でしょうか?
8
8
 
9
9
  #### インターフェイスを作成します。

5

文法の修正

2019/11/15 08:01

投稿

Mao_3309
Mao_3309

スコア5

title CHANGED
@@ -1,1 +1,1 @@
1
- Laravel で DB に格納されている値でサービスコンテナをハンドリングしたい
1
+ Laravel で コントローラーでサービスコンテナを登録したい
body CHANGED
@@ -3,7 +3,7 @@
3
3
  Laravel で Webアプリケーションを作成しています。
4
4
  とあるモジュールをDBに登録されている情報でハンドリングしたいと考えています。
5
5
 
6
- これを実現ためコントローラーサービスコンテナを更新したいです。
6
+ 通常はサービスプロバイダーで行うとと思いまが、リクエストパラメーターを使用しDBアクセスや伴うためコントローラーで行いたいです。
7
7
  そのような方法は可能でしょうか?
8
8
 
9
9
  #### インターフェイスを作成します。
@@ -37,7 +37,6 @@
37
37
  ```
38
38
 
39
39
  #### これをコントローラーでサービスコンテナに登録する方法を確認したいです。
40
- ※通常はサービスプロバイダーで行うとと思いますが、コントローラーでも可能でしょうか?
41
40
  ```
42
41
  namespace App\Http\Controllers;
43
42
 

4

コードの修正

2019/11/15 08:00

投稿

Mao_3309
Mao_3309

スコア5

title CHANGED
File without changes
body CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  #### インターフェイスを作成します。
10
10
  ```
11
- namespace App\Modules
11
+ namespace App\Modules;
12
12
 
13
13
  interface Ia {
14
14
  public function getData();
@@ -17,7 +17,7 @@
17
17
 
18
18
  #### 作成したインターフェイスを継承する 2つのモジュールを作成します。
19
19
  ```
20
- namespace App\Modules
20
+ namespace App\Modules;
21
21
 
22
22
  class B implements Ia {
23
23
  public function getData(){
@@ -27,7 +27,7 @@
27
27
  ```
28
28
 
29
29
  ```
30
- namespace App\Modules
30
+ namespace App\Modules;
31
31
 
32
32
  class C implements Ia {
33
33
  public function getData(){

3

書式の改善、誤字の改善

2019/11/15 06:50

投稿

Mao_3309
Mao_3309

スコア5

title CHANGED
@@ -1,1 +1,1 @@
1
- Lalavel DB に格納されている値でサービスコンテナをハンドリングしたい
1
+ Laravel DB に格納されている値でサービスコンテナをハンドリングしたい
body CHANGED
@@ -1,65 +1,50 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- Lalavel で Webアプリケーションを作成しています。
3
+ Laravel で Webアプリケーションを作成しています。
4
4
  とあるモジュールをDBに登録されている情報でハンドリングしたいと考えています。
5
5
 
6
6
  これを実現するため、コントローラー内でサービスコンテナを更新したいです。
7
7
  そのような方法は可能でしょうか?
8
8
 
9
- ####以下のようなモジュを作成し
9
+ #### インタフェイスを作成します。
10
10
  ```
11
+ namespace App\Modules
11
12
 
12
13
  interface Ia {
13
14
  public function getData();
14
15
  }
16
+ ```
15
17
 
18
+ #### 作成したインターフェイスを継承する 2つのモジュールを作成します。
19
+ ```
20
+ namespace App\Modules
21
+
16
- class B implements Ia{
22
+ class B implements Ia {
17
23
  public function getData(){
18
24
  return 'B';
19
25
  }
20
26
  }
27
+ ```
21
28
 
29
+ ```
30
+ namespace App\Modules
31
+
22
- class C implements Ia{
32
+ class C implements Ia {
23
33
  public function getData(){
24
34
  return 'C';
25
35
  }
26
36
  }
27
-
28
37
  ```
29
38
 
30
- #### サービスコンテナに登録しす。
39
+ #### これをコントローラーでサービスコンテナに登録する方法を確認たいです。
31
-
40
+ ※通常はサービスプロバイダーで行うとと思いますが、コントローラーでも可能でしょうか?
32
41
  ```
33
- class AppServiceProvider extends ServiceProvider
34
- {
35
- /**
36
- * Bootstrap any application services.
42
+ namespace App\Http\Controllers;
37
- *
38
- * @return void
39
- */
40
- public function boot()
41
- {
42
- //
43
- }
44
43
 
45
- /**
46
- * Register any application services.
44
+ use App\Http\Controllers\Controller;
47
- *
48
- * @return void
49
- */
50
- public function register()
45
+ use Illuminate\Http\Request;
51
- {
52
- $this->app->bind(
46
+ use App;
53
-  'App\Modules\Ia',
54
-  'App\Modules\B'
55
- );
56
- }
57
- }
58
47
 
59
- ```
60
-
61
- #### これをコントローラーでハンドリングする
62
- ```
63
48
  class ItemController extends Controller
64
49
  {
65
50
  public function index(Request $request)

2

コードの修正

2019/11/15 06:46

投稿

Mao_3309
Mao_3309

スコア5

title CHANGED
File without changes
body CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
  #### これをコントローラーでハンドリングする
62
62
  ```
63
- ItemController extends Controller
63
+ class ItemController extends Controller
64
64
  {
65
65
  public function index(Request $request)
66
66
  {

1

誤字

2019/11/15 06:28

投稿

Mao_3309
Mao_3309

スコア5

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,7 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
3
  Lalavel で Webアプリケーションを作成しています。
4
- とあるモジュールをDBのユーザーに登録されている情報でハンドリングしたいと考えています。
4
+ とあるモジュールをDBに登録されている情報でハンドリングしたいと考えています。
5
5
 
6
6
  これを実現するため、コントローラー内でサービスコンテナを更新したいです。
7
7
  そのような方法は可能でしょうか?