回答編集履歴

1

追記です。

2018/10/19 06:46

投稿

mix-peach
mix-peach

スコア1910

test CHANGED
@@ -11,3 +11,123 @@
11
11
  聞きたいのは、この差のことでしょうか?
12
12
 
13
13
  これはlaravelがどう・・という話ではなく、phpそのもののお話ですね。。
14
+
15
+
16
+
17
+ ---
18
+
19
+
20
+
21
+ 追記です。
22
+
23
+
24
+
25
+ indexメソッドとshowメソッドそのものの定義に、大きな差はありません。
26
+
27
+
28
+
29
+ showメソッドで、```::```を使ってはいけないわけではないですし、
30
+
31
+ indexメソッドで、```new```してはいけないということでもありません。
32
+
33
+
34
+
35
+ ただ、目的の異なるメソッドですので、中身のコードは変わりますよね。
36
+
37
+ 返却したいものを作る為に、一番簡単に書いたコードがこうだったという話です。
38
+
39
+
40
+
41
+ **■laraveのリソースについても書いてみます■**
42
+
43
+
44
+
45
+ CategoryResourceは、1つのCategoryモデルを配列にしてくれます。
46
+
47
+
48
+
49
+ ここでいう「1つのCategoryモデル」は、
50
+
51
+
52
+
53
+ ```php
54
+
55
+ $category = Category::find(1);
56
+
57
+ ```
58
+
59
+ のように取得された結果で、
60
+
61
+ ```php
62
+
63
+ $category->id;
64
+
65
+ $category->name;
66
+
67
+ ```
68
+
69
+ こんな感じで値を参照できる形をしています。
70
+
71
+
72
+
73
+ showメソッドで扱っている```$cateogry``` は、```$category = Category::find($id)``` の結果と同じものが入っていますので、```new CategoryResource($cateogry)```のように使うことが出来ます。
74
+
75
+
76
+
77
+ 一方、indexメソッドで扱っている```Category::latest()->get()```は、「複数のCategoryモデルが入っているCollection」です。
78
+
79
+
80
+
81
+ phpでこれを扱う場合、
82
+
83
+
84
+
85
+ ```
86
+
87
+ $categories = Category::latest()->get();
88
+
89
+ foreach($categories as $category){
90
+
91
+ echo $category->id;
92
+
93
+ echo $category->name;
94
+
95
+ }
96
+
97
+ ```
98
+
99
+ こんな風に使います。Categoryモデルとは、中身が違いますよね。
100
+
101
+
102
+
103
+ CategoryResourceでは、1つのCategoryモデルしか取り扱えないので、```new CategoryResource(Category::latest()->get())```こういうことはできません。
104
+
105
+
106
+
107
+ 「複数のCategoryモデルが入っているCollection」を配列にする為には、「コレクションリソース」が必要ですが、作るのはちょっと面倒です。
108
+
109
+ で、「リソース」を使って、簡易的に「コレクションリソース」を返却できるよう用意されているのがcollection関数です。
110
+
111
+
112
+
113
+ CategoryResource::collection()で返却されるのは、「コレクションリソース」です。
114
+
115
+ CategoryResourceで返却される「リソース」とは中身が異なります。
116
+
117
+
118
+
119
+ 中身が違うということは、```new CategoryResource``` では生成できないということです。
120
+
121
+ そのため、collection関数はstaticな関数として定義されているのだと思います。
122
+
123
+
124
+
125
+ staticな関数を呼び出す場合には、スコープ定義演算子```::```を使います。
126
+
127
+
128
+
129
+ ということで、
130
+
131
+ indexメソッドでは、```CategoryResource::collection(Category::latest()->get())
132
+
133
+ ```と記述することになります。