問題
複数の変数をreturnで返せない。
return [$posts, $lgtm_min, $lgtm_max];
エラー
ErrorException compact(): Undefined variable: posts
どこか、returnの記述方法を間違えているようなのですが、それがわかりません。
試した例
php
1return $posts, $lgtm_min, $lgtm_max; 2return [$posts, $lgtm_min, $lgtm_max]; 3return array($posts, $lgtm_min, $lgtm_max); 4return compact($posts, $lgtm_min, $lgtm_max);
詳細
fat controller解消のために、PostController.phpの絞り込み検索を分離させた。
(DetailedSearch.phpに処理を移行)
作成したDetailedSearch.php
は下記になる。
app/Services/DetailedSearch.php
DetailedSearch
1<?php 2 3namespace App\Services; 4 5use Illuminate\Support\Facades\DB; 6 7class DetailedSearch 8{ 9 public static function DetailedSearch($query, $lgtm_min, $lgtm_max, $order) 10 { 11 //LGTM sum search 12 if ($lgtm_min !== null) { 13 $query->having('likes_count', '>=', $lgtm_min); 14 } 15 if ($lgtm_max !== null) { 16 $query->having('likes_count', '<=', $lgtm_max); 17 } 18 19 if ($order == 'new') { 20 $posts = $query->orderBy('posts.created_at', 'desc')->paginate(20); 21 } else { 22 $posts = $query->orderBy('likes_count', 'desc')->paginate(20); 23 } 24 25 26 return [$posts, $lgtm_min, $lgtm_max]; 27 } 28}
このDetailedSearch
をPostController.phpで利用し、結果の値を取得する。
DetailedSearch::DetailedSearch($query, $lgtm_min, $lgtm_max);
が実際に利用した箇所です。
PostController
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Models\post; 6use App\Models\tag; 7use Illuminate\Http\Request; 8use Illuminate\Support\Facades\Auth; 9use Illuminate\Support\Facades\DB; 10use App\Services\DetailedSearch; 11 12class PostController extends Controller 13{ 14 15public function my_posts(Request $request) 16 { 17 // values 18 $lgtm_min = $request->input('lgtm-min'); 19 $lgtm_max = $request->input('lgtm-max'); 20 21 // query 22 $query = Post::where("posts.user_id", "=", Auth::user()->id)->withCount('likes'); 23 24 //絞り込み処理 25 DetailedSearch::DetailedSearch($query, $lgtm_min, $lgtm_max); 26 27 //エラー:compact(): Undefined variable: posts 28 return view('posts.my_posts', compact('posts', 'all_posts_count', 'keyword', 'order', 'lgtm_min', 'lgtm_max')); 29 }
これで$postsを取得できると思ったが、結果はエラーが表示された。
下記が実際のエラーメッセージ
ErrorException compact(): Undefined variable: posts
問題の絞り込み
$postsを定義できていないエラーのため、DetailedSearch.php
が失敗していることがわかる。
そこで、dd($posts);
を記述し、$postsが定義しているか?値を取得できているか確認した。
DetailedSearch
1<?php 2 3namespace App\Services; 4 5use Illuminate\Support\Facades\DB; 6 7class DetailedSearch 8{ 9 public static function DetailedSearch($query, $lgtm_min, $lgtm_max, $order) 10 { 11 //LGTM sum search 12 if ($lgtm_min !== null) { 13 $query->having('likes_count', '>=', $lgtm_min); 14 } 15 if ($lgtm_max !== null) { 16 $query->having('likes_count', '<=', $lgtm_max); 17 } 18 19 if ($order == 'new') { 20 $posts = $query->orderBy('posts.created_at', 'desc')->paginate(20); 21 } else { 22 $posts = $query->orderBy('likes_count', 'desc')->paginate(20); 23 } 24 25 //ddを追加 26 27 dd($posts); 28 return [$posts, $lgtm_min, $lgtm_max]; 29 } 30}
dd($posts)の結果、配列を取得できていることがわかる。
このことから、DetailedSearch.phpのreturn
直前まで値を取得できているとわかった。
今度は,PostController.php側でdd($posts)
を追加
PostController
1DetailedSearch::DetailedSearch($query, $lgtm_min, $lgtm_max, $order); 2 3// 追加 4dd($posts); 5return view('posts.my_posts', compact('posts', 'lgtm_min', 'lgtm_max'));
ErrorException Undefined variable: posts
これらのことから、
DetailedSearch.phpのreturn [$posts, $lgtm_min, $lgtm_max];
の記述に問題があるとわかった。
そこで、いくつかreturnについての記事を参考にしましたが、解決に至ってません。
https://www.php.net/manual/ja/language.references.return.php
https://qiita.com/tatsuo-iriyama/items/b0c2dda4426e42d8bc78
お忙しいと思いますが、ご教授のほどよろしくお願いします。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/06 08:19