クラスそのものは、インスタンスを生成しないと利用できません。
ただし、クラス内でstaticに定義されたメソッドは、
「クラスのインスタンス」を生成せずに、スコープ定義演算子::
(ダブルコロン)で、利用可能です。
聞きたいのは、この差のことでしょうか?
これはlaravelがどう・・という話ではなく、phpそのもののお話ですね。。
追記です。
indexメソッドとshowメソッドそのものの定義に、大きな差はありません。
showメソッドで、::
を使ってはいけないわけではないですし、
indexメソッドで、new
してはいけないということでもありません。
ただ、目的の異なるメソッドですので、中身のコードは変わりますよね。
返却したいものを作る為に、一番簡単に書いたコードがこうだったという話です。
■laraveのリソースについても書いてみます■
CategoryResourceは、1つのCategoryモデルを配列にしてくれます。
ここでいう「1つのCategoryモデル」は、
php
1$category = Category::find(1);
のように取得された結果で、
php
1$category->id;
2$category->name;
こんな感じで値を参照できる形をしています。
showメソッドで扱っている$cateogry
は、$category = Category::find($id)
の結果と同じものが入っていますので、new CategoryResource($cateogry)
のように使うことが出来ます。
一方、indexメソッドで扱っているCategory::latest()->get()
は、「複数のCategoryモデルが入っているCollection」です。
phpでこれを扱う場合、
$categories = Category::latest()->get();
foreach($categories as $category){
echo $category->id;
echo $category->name;
}
こんな風に使います。Categoryモデルとは、中身が違いますよね。
CategoryResourceでは、1つのCategoryモデルしか取り扱えないので、new CategoryResource(Category::latest()->get())
こういうことはできません。
「複数のCategoryモデルが入っているCollection」を配列にする為には、「コレクションリソース」が必要ですが、作るのはちょっと面倒です。
で、「リソース」を使って、簡易的に「コレクションリソース」を返却できるよう用意されているのがcollection関数です。
CategoryResource::collection()で返却されるのは、「コレクションリソース」です。
CategoryResourceで返却される「リソース」とは中身が異なります。
中身が違うということは、new CategoryResource
では生成できないということです。
そのため、collection関数はstaticな関数として定義されているのだと思います。
staticな関数を呼び出す場合には、スコープ定義演算子::
を使います。
ということで、
indexメソッドでは、```CategoryResource::collection(Category::latest()->get())
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。