質問編集履歴

7

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

2019/11/15 08:57

投稿

Mao_3309
Mao_3309

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,22 @@
1
+ ### 前提
2
+
3
+ 前提条件としてすでに 1つのモジュール(以下の例で BModule)はすでに実装されております。
4
+
5
+ モジュールは API(REST 通信)にて情報を取得し、後続処理でそのデータを使用します。
6
+
7
+ 今後別の APIプログラムにアクセスする CModule を実装を予定しており、
8
+
9
+ それはユーザーの情報によって切り替える必要があります。
10
+
11
+
12
+
13
+ 既存の処理を変更したくないため、サービスコンテナを切り替えることで、新たなモジュール
14
+
15
+ 「CModule」を実装したいと考えています。
16
+
17
+
18
+
1
- ### 前提・実現したいこと
19
+ ### 実現したいこと
2
-
3
-
4
-
5
- Laravel で Webアプリケーションを作成しています。
6
-
7
- とあるモジュールをDBに登録されている情報でハンドリングしたいと考えています。
8
20
 
9
21
 
10
22
 
@@ -14,7 +26,13 @@
14
26
 
15
27
 
16
28
 
29
+ ### 現状の実装
30
+
31
+ 完全なプログラムを公開することはできないため、一部加工してあります。
32
+
33
+
34
+
17
- #### インターフェイスを作成します。
35
+ #### インターフェイス
18
36
 
19
37
  ```
20
38
 
@@ -22,59 +40,197 @@
22
40
 
23
41
 
24
42
 
25
- interface Ia {
43
+ interface ModuleBase {
26
44
 
27
45
  public function getData();
28
46
 
47
+ public function getPath();
48
+
49
+ public function getItem();
50
+
51
+
52
+
53
+ //その他複数のメソッド
54
+
55
+ ```
56
+
57
+
58
+
59
+ #### 作成したインターフェイスを継承する 2つのモジュール
60
+
61
+ ```
62
+
63
+ namespace App\Modules;
64
+
65
+
66
+
67
+ class BModule implements ModuleBase {
68
+
69
+ private $data;
70
+
71
+ public function getData(){
72
+
73
+ $url = 'https://b.xxxxx.xxx/api/xxx';
74
+
75
+ $client = new \GuzzleHttp\Client();
76
+
77
+ $response = $client->request(
78
+
79
+ 'POST',
80
+
81
+ $url,
82
+
83
+ ['key' => 'xxxxxxx']
84
+
85
+ );
86
+
87
+ $this->data = $response->getBody();
88
+
89
+ }
90
+
91
+ public function getPath(){
92
+
93
+ return $this->data['path'];
94
+
95
+ }
96
+
97
+ public function getItem(){
98
+
99
+ return $this->data['item'];
100
+
101
+ }
102
+
103
+
104
+
105
+ //その他複数のメソッド
106
+
107
+
108
+
109
+ ```
110
+
111
+
112
+
113
+ ```
114
+
115
+ namespace App\Modules;
116
+
117
+
118
+
119
+ class CModule implements ModuleBase {
120
+
121
+ public function getData(){
122
+
123
+ $url = 'https://c.xxxxx.xxx/api/xxx';
124
+
125
+ $client = new \GuzzleHttp\Client();
126
+
127
+ $response = $client->request(
128
+
129
+ 'POST',
130
+
131
+ $url,
132
+
133
+ ['key' => 'xxxxxxx', 'user' => 'xxxxxx']
134
+
135
+ );
136
+
137
+ $this->data = $response->getBody();
138
+
139
+ }
140
+
141
+ public function getPath(){
142
+
143
+ $res = implode('/', $this->data['path'])
144
+
145
+ return $res;
146
+
147
+ }
148
+
149
+ public function getItem(){
150
+
151
+ return $this->data['item'];
152
+
153
+ }
154
+
155
+
156
+
157
+ //その他複数のメソッド
158
+
159
+
160
+
161
+ ```
162
+
163
+
164
+
165
+ #### 既存処理である BModule はサービスコンテナに登録されている
166
+
167
+ ```
168
+
169
+ namespace App\Providers;
170
+
171
+
172
+
173
+ use Illuminate\Support\ServiceProvider;
174
+
175
+
176
+
177
+ class AppServiceProvider extends ServiceProvider
178
+
179
+ {
180
+
181
+ /**
182
+
183
+ * Bootstrap any application services.
184
+
185
+ *
186
+
187
+ * @return void
188
+
189
+ */
190
+
191
+ public function boot()
192
+
193
+ {
194
+
195
+ //
196
+
197
+ }
198
+
199
+
200
+
201
+ /**
202
+
203
+ * Register any application services.
204
+
205
+ *
206
+
207
+ * @return void
208
+
209
+ */
210
+
211
+ public function register()
212
+
213
+ {
214
+
215
+ $this->app->bind(
216
+
217
+ 'App\Modules\ModuleBase',
218
+
219
+ 'App\Modules\BModule'
220
+
221
+ );
222
+
223
+ }
224
+
29
225
  }
30
226
 
227
+
228
+
31
- ```
229
+ ```
32
-
33
-
34
-
35
- #### 作成したインターフェイスを継承する 2つのモジュールを作成します。
230
+
36
-
37
- ```
231
+
38
-
39
- namespace App\Modules;
232
+
40
-
41
-
42
-
43
- class B implements Ia {
44
-
45
- public function getData(){
46
-
47
- return 'B';
48
-
49
- }
50
-
51
- }
52
-
53
- ```
54
-
55
-
56
-
57
- ```
58
-
59
- namespace App\Modules;
60
-
61
-
62
-
63
- class C implements Ia {
64
-
65
- public function getData(){
66
-
67
- return 'C';
68
-
69
- }
70
-
71
- }
72
-
73
- ```
74
-
75
-
76
-
77
- #### これをコントローラーでサービスコンテナ登録する方法を確認したいです。
233
+ #### 既存処理 BModule をコントローラーで CModule 切り替えたい
78
234
 
79
235
  ```
80
236
 
@@ -98,30 +254,30 @@
98
254
 
99
255
  {
100
256
 
101
- $id = $request->input('item_id');
257
+ $id = $request->input('user_id');
102
-
258
+
103
- $item = \App\Item::find($id);
259
+ $user = \App\User::find($id);
104
-
105
-
106
-
260
+
261
+
262
+
107
- if($item->status == 1){
263
+ if($user->apiStatus == 1){
108
-
264
+
109
- //■■ここで Ia と C をバインドする方法が知りたいです。■■
265
+ //■■ここで ModuleBase と CModule をバインドする方法が知りたいです。■■
110
266
 
111
267
 
112
268
 
113
269
  }
114
270
 
115
- $ia = App::make(App\Modules\Ia::class);
271
+ $api = App::make(App\Modules\ModuleBase::class);
116
-
272
+
117
- $ia->getData();//C
273
+ $api->getData();
274
+
275
+
276
+
118
-
277
+ //これ以降にも「App::make(App\Modules\ModuleBase::class)」を使用してデータを取得する処理があります。
278
+
119
- }
279
+ //既存の処理を変更したくないため、サービスコンテナで切り替えたいと考えております。
120
-
121
- }
280
+
122
-
281
+
282
+
123
- ```
283
+ ```
124
-
125
-
126
-
127
- このような使い方自体がアンチパターンの場合はご指摘ください。

6

誤字

2019/11/15 08:57

投稿

Mao_3309
Mao_3309

スコア5

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
 
11
- 通常はサービスプロバイダーで行うとと思いますが、リクエストパラメーターを使用したDBアクセス伴うためコントローラーで行いたいです。
11
+ 通常はサービスプロバイダーで行うとと思いますが、リクエストパラメーターを使用したDBアクセス伴うためコントローラーで行いたいです。
12
12
 
13
13
  そのような方法は可能でしょうか?
14
14
 

5

文法の修正

2019/11/15 08:01

投稿

Mao_3309
Mao_3309

スコア5

test CHANGED
@@ -1 +1 @@
1
- Laravel で DB に格納されている値でサービスコンテナをハンドリングしたい
1
+ Laravel で コントローラーでサービスコンテナを登録したい
test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
 
11
- これ実現するためコントローラーサービスコンテナを更新したいです。
11
+ 通常はサービスプロバイダーで行うとと思いますが、リクエストパラメーター使用しDBアクセスや伴うためコントローラーで行いたいです。
12
12
 
13
13
  そのような方法は可能でしょうか?
14
14
 
@@ -76,8 +76,6 @@
76
76
 
77
77
  #### これをコントローラーでサービスコンテナに登録する方法を確認したいです。
78
78
 
79
- ※通常はサービスプロバイダーで行うとと思いますが、コントローラーでも可能でしょうか?
80
-
81
79
  ```
82
80
 
83
81
  namespace App\Http\Controllers;

4

コードの修正

2019/11/15 08:00

投稿

Mao_3309
Mao_3309

スコア5

test CHANGED
File without changes
test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  ```
20
20
 
21
- namespace App\Modules
21
+ namespace App\Modules;
22
22
 
23
23
 
24
24
 
@@ -36,7 +36,7 @@
36
36
 
37
37
  ```
38
38
 
39
- namespace App\Modules
39
+ namespace App\Modules;
40
40
 
41
41
 
42
42
 
@@ -56,7 +56,7 @@
56
56
 
57
57
  ```
58
58
 
59
- namespace App\Modules
59
+ namespace App\Modules;
60
60
 
61
61
 
62
62
 

3

書式の改善、誤字の改善

2019/11/15 06:50

投稿

Mao_3309
Mao_3309

スコア5

test CHANGED
@@ -1 +1 @@
1
- Lalavel DB に格納されている値でサービスコンテナをハンドリングしたい
1
+ Laravel DB に格納されている値でサービスコンテナをハンドリングしたい
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- Lalavel で Webアプリケーションを作成しています。
5
+ Laravel で Webアプリケーションを作成しています。
6
6
 
7
7
  とあるモジュールをDBに登録されている情報でハンドリングしたいと考えています。
8
8
 
@@ -14,9 +14,11 @@
14
14
 
15
15
 
16
16
 
17
- ####以下のようなモジュを作成し
17
+ #### インタフェイスを作成します。
18
18
 
19
19
  ```
20
+
21
+ namespace App\Modules
20
22
 
21
23
 
22
24
 
@@ -26,9 +28,19 @@
26
28
 
27
29
  }
28
30
 
31
+ ```
29
32
 
30
33
 
34
+
35
+ #### 作成したインターフェイスを継承する 2つのモジュールを作成します。
36
+
37
+ ```
38
+
39
+ namespace App\Modules
40
+
41
+
42
+
31
- class B implements Ia{
43
+ class B implements Ia {
32
44
 
33
45
  public function getData(){
34
46
 
@@ -38,9 +50,17 @@
38
50
 
39
51
  }
40
52
 
53
+ ```
41
54
 
42
55
 
56
+
57
+ ```
58
+
59
+ namespace App\Modules
60
+
61
+
62
+
43
- class C implements Ia{
63
+ class C implements Ia {
44
64
 
45
65
  public function getData(){
46
66
 
@@ -50,77 +70,27 @@
50
70
 
51
71
  }
52
72
 
53
-
54
-
55
73
  ```
56
74
 
57
75
 
58
76
 
59
- #### サービスコンテナに登録しす。
77
+ #### これをコントローラーでサービスコンテナに登録する方法を確認たいです。
78
+
79
+ ※通常はサービスプロバイダーで行うとと思いますが、コントローラーでも可能でしょうか?
80
+
81
+ ```
82
+
83
+ namespace App\Http\Controllers;
60
84
 
61
85
 
62
86
 
63
- ```
87
+ use App\Http\Controllers\Controller;
64
88
 
65
- class AppServiceProvider extends ServiceProvider
89
+ use Illuminate\Http\Request;
66
90
 
67
- {
68
-
69
- /**
70
-
71
- * Bootstrap any application services.
72
-
73
- *
74
-
75
- * @return void
76
-
77
- */
91
+ use App;
78
-
79
- public function boot()
80
-
81
- {
82
-
83
- //
84
-
85
- }
86
92
 
87
93
 
88
-
89
- /**
90
-
91
- * Register any application services.
92
-
93
- *
94
-
95
- * @return void
96
-
97
- */
98
-
99
- public function register()
100
-
101
- {
102
-
103
- $this->app->bind(
104
-
105
-  'App\Modules\Ia',
106
-
107
-  'App\Modules\B'
108
-
109
- );
110
-
111
- }
112
-
113
- }
114
-
115
-
116
-
117
- ```
118
-
119
-
120
-
121
- #### これをコントローラーでハンドリングする
122
-
123
- ```
124
94
 
125
95
  class ItemController extends Controller
126
96
 

2

コードの修正

2019/11/15 06:46

投稿

Mao_3309
Mao_3309

スコア5

test CHANGED
File without changes
test CHANGED
@@ -122,7 +122,7 @@
122
122
 
123
123
  ```
124
124
 
125
- ItemController extends Controller
125
+ class ItemController extends Controller
126
126
 
127
127
  {
128
128
 

1

誤字

2019/11/15 06:28

投稿

Mao_3309
Mao_3309

スコア5

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Lalavel で Webアプリケーションを作成しています。
6
6
 
7
- とあるモジュールをDBのユーザーに登録されている情報でハンドリングしたいと考えています。
7
+ とあるモジュールをDBに登録されている情報でハンドリングしたいと考えています。
8
8
 
9
9
 
10
10