Blade 将值从 view 传递到 master,然后再传递给 header.blade

Blade passing values from view to master and then pass it to header.blade

我有一个扩展 master 的视图文件 users.blade.php。 master 包含另一个名为 header.blade.php 的文件,我想将一些数据从 users.blade 传递到 header.blade。

这是文件的简化版本

/****** Users.blade.php *********/
@extends('shared.master')
@section('title', 'Dashboard')

@section('pagecss')
    <link rel="stylesheet" href="links to css file" />
@endsection

这里是master.blade.php

/******Shared/master.blade.php ********/
<html>
    <head>
        <title>@yield('title')</title>
        @include('shared.header')
    </head>
    <body >

        @yield('content')

    </body>
</html>

这是头文件

/******Shared/header.blade.php ********/
<link rel="stylesheet" href="links to bootstrap" />
@yield('pagecss')
<link rel="stylesheet" href="links to other files" />

@yield('pagecss') 在 header.blade 中不起作用,但它在 master.blade 中起作用。 现在我不能将其粘贴到 master.blade 中,因为有些文件会覆盖其他文件,因此必须按特定顺序粘贴。有什么想法可以让 yield 在 header.blade 中发挥作用吗?

编辑: 我确实喜欢 Bharat Geleda 方法,我修改了代码以包含一些 heredocs 以使其更方便。但我认为这是一种 hack,仍在寻找更好的解决方案。

/********** Users.blade.php ***********/
@extends('shared.master')
@section('title', 'Dashboard')

@section('pagecss')
    <link rel="stylesheet" href="links to css file" />
@endsection

<?php $pagecss = <<<CSS_FILES
<link rel="stylesheet" href="links to page css" />
CSS_FILES;
?>

/*********** Shared/header.blade.php **********/
@if(isset($pagecss))
    {{-- */ echo $pagecss;/* --}}
@endif

一个可能的解决方案是这样做

<?php $pagecss = '<link rel="stylesheet" href="links to css file" />'?>
    /****** Users.blade.php *********/
    @extends('shared.master')
    @section('title', 'Dashboard')

master.blade.php 会保持不变

/******Shared/master.blade.php ********/
<html>
    <head>
        <title>@yield('title')</title>
        @include('shared.header')
    </head>
    <body >

        @yield('content')

    </body>
</html>

然后在你的头文件中你可以这样做

/******Shared/header.blade.php ********/
<link rel="stylesheet" href="links to bootstrap" />
@if(isset($pagecss))
    {{ $pagecss }}
@endif
<link rel="stylesheet" href="links to other files" />

编辑:测试问题

main.blade.php (master in your case)

<html>
<head>
    @include('test.header')
</head>
<body >

@yield('content')

</body>
</html>

header.blade.php

<link rel="stylesheet" href="links to bootstrap" />
@yield('pagecss')
<link rel="stylesheet" href="links to other files" />

users.blade.php

@extends('test.main')

@section('content')
    CONTENT
@endsection

@section('pagecss')
    <link rel="stylesheet" href="links to css file" />
@endsection

输出:

<html>
<head>
    <link rel="stylesheet" href="links to bootstrap" />
    <link rel="stylesheet" href="links to css file" />
    <link rel="stylesheet" href="links to other files" />
</head>
<body >

    CONTENT

</body>
</html>

我想这符合预期。

简单,如果它在主页而不是在内部视图中工作,那就意味着你已经使用过它,并且Blade将只采取更高的级别并解决它(将其内容包括在 @yield 中应放置的位置)。

我想说的是,如果您在 header 文件中有一个 @yield 并且您稍后将其用作 @section('pagecss'),您会得到另一个视图case Users.blade.php with the same statement @section('pagecss') blade 不会取里面的.

解决方案

好方法但愚蠢:

在您共享的 header blade 文件中创建另一个 @yield 并将其命名为二级或类似名称。即 @yield('pagecss-2')

好办法:

使用 @parent,此指令将向布局附加(而不是覆盖)内容

docs of laravel

中所述