将数据绑定到 Laravel 5.1 中的特定 blade 模板(视图编辑器在嵌套模板上被调用两次的问题)

Bind data to specific blade templates in Laravel 5.1 (Issue with view composer being called twice on nested template)

我正在尝试在站点中实施主题,以便某些页面具有与其他页面不同的外观和感觉(和功能)。

我有 master.blade.php,它包含完整的 HTML 结构,并有 @section@yield 来获取内容:

<html>
<body>

    @section('master-template')
    <?php
        view()->share('masterTemplate', 'general');
        $masterTemplate = "general"; 
    ?>
    @stop

    <header>
        @section('nav-1')
            @include('layout.navs.house-links')
        @show

        @section('nav-2')
            @include ('layout.navs.contact-links')
        @show

        @section('nav-3')
            @include('layout.navs.product-links')
        @show

        @section('nav-4')

        @show
    </header>
    @yield('content')
</body>
</html>

然后我有 ford.blade.php 它扩展了 master,并覆盖了一些东西:

@extends('templates.master')

@section('master-template')
    <?php
        view()->share('masterTemplate', 'ford');
        $masterTemplate = "ford"; 
    ?>
@overwrite

@section('nav-1')
    @include('layout.navs.house-links')
@overwrite

@section('nav-2')
    @include ('layout.navs.contact-links')
@overwrite

@section('nav-3')
    @include('layout.navs.product-links')
@overwrite

然后网站上的常规页面将扩展 master.blade,任何需要福特导航栏和配色方案的内容都会扩展 ford.blade模板。

然后我将视图编辑器绑定到 layout.navs.product-links,它从视图数据中获取 $masterTemplate 变量并检查它是否是我们的主题之一(如 "ford")。如果是普通页面,它会将所有制造商的车型系列绑定到视图,如果是福特页面,它只会将福特系列绑定到该页面。视图编辑器的 pseudo-code 如下:

public function compose(View $view)
{
    // Get the view data
    $viewData = $view->getData();

    // Check for $masterTemplate view variable
    if (isset($viewData['masterTemplate'])) {
        $template = $viewData['masterTemplate'];

        if ($template == "ford") {
            $ranges = $this->getRangesForManufacturer($template);
        }else {
            $ranges = $this->getRangesForAllManufacturers();
        }

        $view->with('ranges', $ranges);
    }
}

问题是,因为 ford.blade 扩展了 master.blade,两个视图都在幕后呈现。所以上面的视图编写器逻辑是无用的,因为它在 "ford" 页面上运行了两次,一次是 master.blade 一次是 ford.blade.

我通过使用 Laravel DebugBar 检查 运行 的查询证明了这一点。

  1. 如何绑定变量 $masterTemplate 以在所有视图(和部分视图)中使用,以检查视图内部的逻辑是 "ford" 还是 "general" 页?我在 ford.blade 中用 @section@overwrite 做到了,但这似乎并不适用于所有地方。

  2. 如何使用视图编辑器将数据绑定到 @included by ford.blademaster.blade,因为 ford.blade 扩展了 master.blade 等等view composer 被执行了两次。

乍一看,@overwrite 可能会按照您的指示去做(除了 @stop 就足够了,请参阅 how to extend a layout)。

作为一种变通方法:重新设计一下,您有一个 meta-master 模板,其中包含一般内容并由 fordmaster 扩展(即一般) 模板,具体取决于您需要哪一部分? (然后您可以将 master 重命名为 general 并将 meta-master 重命名为 master

那会跳过你的问题,因为在每个实例中只会定义一个。