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

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

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

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

PHP

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

Blade

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

Q&A

1回答

2217閲覧

Laravel bladeで正しくincludeできない

op_pochi

総合スコア0

Laravel

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

PHP

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

Blade

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

0グッド

0クリップ

投稿2022/06/19 07:18

環境

Homestead
Laravel 9.11

現象

複数のbladeファイルを@includeしたときに、指定したものと異なるbladeが読み込まれてしまう。

php

1@include('hoge_list.section.section_a') 2@include('hoge_list.section.section_b')

こうした時に、section_bの欄に、section_aのbaldeがincludeされてしまいます。
→section_aが2回includeされる
前後を逆にした場合、section_bが2回includeされるため、bladeファイル自体に問題はないと考えており、
extendsやincludeの関係性に問題があるかと疑っていますが、解決できない状況です。

フォルダ構成

 views   ┣ hoge_list   ┃  ┣ section   ┃  ┃  ┣ section_a.blade.php   ┃  ┃  ┗ section_b.blade.php   ┃  ┗ main.blade.php   ┗ template      ┣ section.blade.php      ┗ parent.blade.php

ソース

template\parent.blade.php

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 ~省略~ 5</head> 6<body> 7 @yield('contents') 8</body> 9</html>

template\section.blade.php
~省略~

hoge_list\main.blade.php

php

1@extends('template.parent') 2 3@section('contents') 4 @include('hoge_list.section.section_a') 5 @include('hoge_list.section.section_b') 6@endsection

hoge_list\section\section_a.blade.php

php

1@extends('template.section') 2 ~省略~

routes\web.php

php

1Route::get('/hoge_list', function () { 2 return view('hoge_list.main'); 3});

想像としては、@includeは単にファイルの中身が読み込まれるだけという認識なので、
section_aの@extendsが動く前に@includeされてしまい、うまく動かないとか、そのあたりを疑っています。
お力をお貸しください。

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

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

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

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

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

guest

回答1

0

@includeは単にファイルの中身が読み込まれるだけという認識

読み込まれるだけ。。というのがどういう意味かちょっと曖昧ですが、
おそらく認識が違います。
includeする側でも、includeされる側でも、bladeファイル上の処理内容は同じです。

肝心な部分が省略されているのでここからは推測になりますが、
以下の様な構造になっていませんか?

template\section.blade.php

php

1<div> 2@yield('section_nakami') 3</div>

hoge_list\section\section_a.blade.php

php

1@extends('template.section') 2 3@section('section_nakami') 4【aの内容】 5@endsection

hoge_list\section\section_b.blade.php

php

1@extends('template.section') 2 3@section('section_nakami') 4【bの内容】 5@endsection

だとすれば、@yield('***')@section('***')の使い方・・理解が、間違っています。

@section('AAA')は、「AAA」というレイアウトの定義しますよ
@yield('AAA')は、その定義されたレイアウト「AAA」を表示しますよ

という役割になります。
定義は、一回宣言した後は、内容を変更できません。(※1画面の表示内において)

例示の構造では、

section_aを先に@includeすれば、section_nakamiは、【aの内容】と定義されるので、
後から読み込んだbでも、【aの内容】が表示され、
section_bを先に@includeすれば、section_nakamiは、【bの内容】と定義されるので、
後から読み込んだaでも、【bの内容】が表示されますが、
これは、bladeの仕様通りの挙動です。


上記、推測ですので、検討違いの指摘でしたらご容赦を。

指摘が違う場合は、内容改めますので、

・template\section.blade.php
・hoge_list\section\section_a.blade.php
・hoge_list\section\section_b.blade.php

を、省略せずに記載してください。

投稿2022/06/20 04:39

mix-peach

総合スコア1910

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問