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

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

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

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

解決済

2回答

1294閲覧

Laravelで@includeしたテンプレートに値を渡す時のつまづき

kipipipi

総合スコア60

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

0クリップ

投稿2020/10/16 02:30

編集2020/10/16 03:19

あるoya.blade.phpで@includeを使用してkodomo.blade.phpというviewを読み込んでいるときに,KodomoControllerのindexメソッド(web.phpで設定したルートを通るものだと(GET)思っていた)が走ると思っていたのですが,動いていない様です。

やりたいことはKodomo.blade.phpへ値を渡したいだけなので呼び出し元のOya.balde.phpから値を渡せばいいだけです。

しかし、

@includeした時に(kodomo.blade.php担当の)KodomoController.phpで値を作成して(特にindexメソッド)渡せると、1つのコントローラ(この場合OyaController.php)が肥大化しなくて良いなと思っています。

@includeを使用すると直接kodomo.blade.phpを読み込んでいる様に見られるのですが,こういう場合KodomoController.phpのindexメソッドを走らせるための書き方はあるのでしょうか?

php

1呼び出し元のoya.blade.php 2 3 <div class="modal-body"> 4 @include('kodomo') 5 </div>

php

1web.php 2 3Route::get('/kodomo','KodomoController@index')->name('kodomo.index');

php

1KodomoController.php 2 3 public function index(){ 4 $carbon = Carbon::now(); 5 $this_year = $carbon->year; 6 $this_month = $carbon->month; 7 $this_today = $carbon->day; 8 $this_hour = $carbon->hour; 9 10 return view('kodomo',compact('this_year','this_month','this_today','this_hour')); 11 }

php

1kodomo.blade.php一部 2 3 <select name='year'> 4 @foreach (range(2020,2025) as $year) 5 @if($year === $this_year) 6 <option value="{{ $year }}" selected> {{ $year }}</option> 7 @else 8 <option value="{{ $year }}"> {{ $year }}</option> 9 @endif 10 @endforeach 11 </select>

もちろん直接/kodomoを叩けばKodomoController.phpのindexメソッドが動きます。
@includeで動かそうとすると、$this_yearがないぞ!とお叱りお受けます。

分かりづらい文章になってしまい申し訳ありませんが、ご存知の方がいらっしゃいましたらご教授いただけると嬉しいです。
よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/10/16 02:51

仮のものが多すぎて全体像が見えません。 データの構成や流れなどを整理されたほうが良いかと思います。 できれば、具体的な内容で。
kipipipi

2020/10/16 03:20

ご指摘ありがとうございます。 自分でも混乱するなと思いましたので、書き直しました。 よろしくお願いします。
guest

回答2

0

ベストアンサー

前提として、viewからコントローラを呼び出しているのではなく、
リクエストに応じてルーティングで利用するコントローラが振り分けられ、
そのコントローラから利用するviewに情報が渡ります。

つまり、コントローラで作った情報が欲しいなら、そのコントローラを呼び出すためのリクエストを投げなければなりません。

「同じような情報なら毎回書くのは手間で冗長である」という気持ちは分からなくもないですが、
コントローラにもviewにも役割があります。

そのコントローラは何のためのコントローラ?
そのviewは何のためのコントローラ?

サブとして呼び出されるviewが、単体でも使うということはあまりないかと思います。
非同期通信で一部だけレスポンスで返すことならあるかもしれませんが、用途は同じなので役割も明確になっています。

何が言いたいかというと
**「データを共有したいならそのデータを管理する場所を作れ」**ということです。

viewはあくまでコントローラからきた情報を表示するため、
コントローラはリクエストを処理するため、

となるとこの2つに「データの管理」という役割は持たせられません。

あとは、モデルですが、これはデータベース部分の役割を担うので微妙です。
ということで、そのどれでもない別のクラスを用意すると良いのではないでしょうか。
ただ、「冗長な記述なるのを防ぎたい」くらいだとクラスを作るのはコストは高くなります。

となると、コントローラの中にprivateメソッド作って共有したい情報を取得するようにするとかですかね。

などなど色々考えられますが、
個人的には現在の情報くらいなら毎回書いても大したことはないと考えます。
「役割」から考えてください。

今回、newしたCarbonオブジェクトそのまま渡すだけでもviewで処理できるようにも思います。
実質1行なので、あまり共通化にこだわるメリットもないです。

投稿2020/10/16 03:39

m.ts10806

総合スコア80850

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

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

kipipipi

2020/10/16 03:55

コードの解決だけでなく、今後の考え方も教えていただき大変勉強になりました!! 今回の様に別に肥大化と言えないレベルはありますが、今後大きなものを扱う時にこの考え方が役に立つだろうと思います! 見やすさなどから最近分けたがるのですが、確かに分けただけ苦労している部分もありますのでもう少しコストを考えていきたいと思います! 大変ありがとうございました!
m.ts10806

2020/10/16 04:03

あの、結局どう理解してどう解決したのか分からないんですが・・
kipipipi

2020/10/16 05:19

OyaController.phpに値を作成させて(Carbonのオブジェクト)、 @include(kodomo,'carbon'); で解決しました。 今回大した大きさのコードではないのも事実で "実質1行なので、あまり共通化にこだわるメリットもないです。" とのことから今回は上記のコードにしました。 (時間等は配列で渡すつもりだったのでcarbonのオブジェクト渡せるの知らなっかので助かりました。)
m.ts10806

2020/10/16 05:26

了解です。 >時間等は配列で渡すつもりだったので 配列もオブジェクトです。というか全て「オブジェクト」です。 結局は変数なので、あとはどのように扱いたいか次第ですよ。 動いてるのはPHPです。 テンプレートエンジンも裏ではPHPで置換処理が走っています。
kipipipi

2020/10/16 05:30

今回共通化させるのではなく、それぞれのconrtollerにそれぞれのbladeを管理させてお隣の敷居にあまり入って欲しくないっていうのが本音です。(分けたい病) なので@includeした時にKodomoControllerのindex呼べないのかな?他に方法があるのかな? との思いから質問させていただきました。 今回はコストに合わない、分けるほどでもないとのご指摘はごもっともなのでOyaControllerに値の作成をお願いする事にしました。 私の質問の仕方が適切でなかったので、皆さんを混乱させました。大変失礼いたしました。 「コスト」という考え、私にあまり根付いていない考えだったので勉強になりました。 ありがとうございました! (ご回答はとても納得する内容だったのでlaravel、cake、djangoを勉強するにあたって参考にしながら作りたいと思います)
m.ts10806

2020/10/16 05:31

>OyaControllerに値の作成をお願いする事にしました。 事情が良く分かりませんが。。
kipipipi

2020/10/16 05:41

oya.balde.phpを表示する(管理する)OyaController.php内で様々な変数・オブジェクト(carbonだけでなく)を用意してもらって、oya.blade.phpが@includeした時にkodomo.blade.phpに値を渡してもらうという事です。 その時以外はKodomoController.phpがkodomo.blade.phpを管理します。 すみません、根は綺麗に役割を分けたかっただけなんです。。。 (cakeで1つのcontrollerを肥大させまくったトラウマにより。。。) 長いお時間お付き合いありがとうございました!
m.ts10806

2020/10/16 05:51

あぁなるほど。 複数メンバー、または自身は依頼を受けているだけなのかと思いました。
kipipipi

2020/10/16 05:57

すみません、もっと適切な言い回ししないと混乱させますね。。。 申し訳ありません。。。
guest

0

includeは他のBladeビューを読み込むためのものなので、
そういった使い方はできないかと思います。
あえて、includeからメソッドを呼ぼうとせずに、
別のメソッドと紐づいているviewをinclude
するのではだめなのでしょうか?

投稿2020/10/16 02:45

firegrape

総合スコア902

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

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

kipipipi

2020/10/16 03:23

ご回答ありがとうございます! includeするとメソッドが動かないと思っていたのですが、もう少しだけ具体的にどういったコードにするのかご教授いただけますでしょうか。。。 よろしくお願いします。
firegrape

2020/10/16 03:31

えっと、 oya.blade.php で kodomo.blade.php の $this_year を使いたい場合は、 @include('kodomo', 'this_year') <select name='year'> @foreach (range(2020,2025) as $year) @if($year === $this_year) <option value="{{ $year }}" selected> {{ $year }}年 </option> @else <option value="{{ $year }}"> {{ $year }}年 </option> @endif @endforeach </select>
kipipipi

2020/10/16 03:42

firegrape様 コードまでありがとうございます! この方法で渡すことを私も考えたのですが、OyaContoroller.php が肥大化するのが嫌だなぁ。。。と思っていた次第で、 できれば本当はkodomo.blade.phpを担当するKodomoController.phpに変数の作成をお願いしたいのに。。。という状態でした。 @includeではKodomoController.phpのメソッドを起動(?)できなければ教えていただいた方法で行うしかないと思っています。
firegrape

2020/10/16 03:46

肥大化ですか?? @include('kodomo', 'this_year') を入れるだけでですか? えっと、変数を呼ぶだけでコントローラ(メソッド)から動かす方が 自分は微妙な感じがしますが、、
kipipipi

2020/10/16 05:58

今後大きなものを扱う時に、という意味です。 言葉足らずで失礼しました。 今回は小さなコードなので気になりませんが、(私の中で)関係ないcontrollerに仕事させたくないなという思いから質問しました。 伝わりづらい質問だったと思います。申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問