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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

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

Q&A

解決済

2回答

4199閲覧

LaravelでAPIリソースでのcollectionとnewの使用タイミング

kokaa

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

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

0グッド

0クリップ

投稿2018/10/18 04:53

現在LaravelでAPIサーバーを開発しているプログラミング初心者です。

APIを構築するに当たり、JSONレスポンスを整形するために書籍やネットにある情報を見ながら、見よう見まねでresourceを作成しました。

正常に動作はしているのですが、よく理解できない点が下記

CategoryController.php

php

1public function index() 2 { 3 return CategoryResource::collection(Category::latest()->get()); 4 }

php

1public function show(Category $category) 2 { 3 return new CategoryResource($category); 4 }

この場合なぜ showメソッドではインスタンスを生成しているにもかかわらず、indexメソッドでは::collectionとしているのでしょうか?

どなたかご教示いただけると幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

https://readouble.com/laravel/5.6/ja/eloquent-resources.html

new CategoryResourceCategoryResource::collection の使い分けは、単に 一つのモデルを返却したいのか それとも 複数のモデル(=コレクション)を返却したいのか ということです。

細かく確認したわけではありませんが CategoryResource::collection もコレクションインスタンスを生成して返しているはずです。

一般的に、 index では複数データを返し、 show では単一データを返す作りにする場合が多いです。
なので index では CategoryResource::collectionshow では new CategoryResource とそれぞれ用いているのだと思います。

投稿2018/10/18 06:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

クラスそのものは、インスタンスを生成しないと利用できません。

ただし、クラス内で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())

投稿2018/10/18 06:04

編集2018/10/19 06:46
mix-peach

総合スコア1910

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

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

kokaa

2018/10/18 06:32

こちら試しにshowメソッドで :: で利用しようとしたところエラーとなりました。 indexメソッドとshowメソッドで何が違うのでしょうか?
mix-peach

2018/10/19 06:46

回答に追記してみました!
kokaa

2018/10/19 07:07

とてもわかりやすい説明ありがとうございます! スッキリ理解できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問