刀片模板-@extends和@section不起作用

时间:2019-06-20 07:24:14

标签: php laravel laravel-blade

我正在学习laravel框架,并尝试使用刀片模板引擎。但是我终生无法使用@extends和@section功能在我的项目中工作。

我已经尝试使用不同的浏览器多次重新安装整个项目,然后重新启动计算机,但是我不知道为什么它不显示@section内容

Laravel版本:5.7.28 | IDE:PhpStorm

routes / web.php

Route::get('/', function () {
    return view('layouts/index');
});

views / layouts / index.blade.php

<body>
<div class="container-fluid">
    <h1>Site Index</h1>
    @yield('header')
</div>
</body>

views / header.blade.php

@extends('layouts.index')

@section('header')
    <p>Header</p>
@endsection

目前显示的只是在views / layouts / index.blade.php文件中的标记。

非常感谢您为此提供的任何信息。

4 个答案:

答案 0 :(得分:3)

这不是模板的工作方式。您必须在return语句中引用子模板。由于@extends在此子模板中,因此Laravel知道使用提到的主版式。因此,您的退货声明将如下所示:

return view('header');

如果只希望标题显示在每个页面上,则不需要在标题中扩展主版面,只需在主版面中包含标题部分即可。

<body>
<div class="container-fluid">
    <h1>Site Index</h1>
    @include('header')
</div>
</body>

答案 1 :(得分:0)

我已经测试了看起来可行的视图和布局。检查您的控制器退货声明。尝试return view('header');

Route::get('/', function () {
    return view('header');
});

答案 2 :(得分:0)

感谢大家的回应,现在我了解了刀片模板引擎如何更好地工作以及我做错了什么。只是为了澄清那些像我一样困惑并遇到此问题的人:

当您通过网络路线重定向到视图时,它必须是从布局母版扩展来的子视图。

routes / web.php

Route::get('/', function () {
    return view('index');
});

默认情况下,将显示主文件中的html及其我们正在查看的内容

views / layouts / master.blade.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>@yield('title', 'default title if unspecified')</title>
</head>
<body>
    <h1>Master Header</h1>
    @yield('content')
</body>
</html>

要使用页面的内容,然后使用@section('content')方法使用的索引视图。

views / index.blade.php

@extends('layouts.master')

@section('title', 'Changing the default title')

@section('content')
    <p>content displayed</p>
@endsection

我希望这对其他人有帮助。

答案 3 :(得分:0)

If you want to show content of section('header') then you must return header view like

Route::get('/', function () {
    return view('header');
});

this is because contents are in header view and you have been extending layout.index

so if you return layout.index view you will not see content of section('header')