在Laravel

时间:2017-02-09 19:46:25

标签: laravel view render blade directive

目前我正在开发一个项目,其中需要通过自定义Blade指令呈现视图。但是我遇到了一些(限制?)错误,我无法解决(很长一段时间)。

我的自定义Blade指令,以树的不同方式输出视图。

Blade::directive('lwField', function ($expression) {

    // 1
    return view('lw::module.field.field')->render();

    // 2
    return Blade::compileString('{!! view("lw::module.field.field")->render() !!}');

    // 3
    return Blade::compileString('@include("lw::module.field.field")');

});

字段视图:

Get to the choppa!

主要观点:

@extends('layout.default')

@section('main_content')

    @lwField()

@endsection

布局文件:

// ... some cool html

@section ('main_content') 

@show

// ... even more cool html

当我分别执行这三种方法时会发生以下情况:

1 return view('lw::module.field.field')->render();

第一次执行它会引发错误:

include(/somepath/storage/framework/views/b30c24f5b8fd420ef1a08edb52e92174e2dfe911.php): failed to open stream: No such file or directory (View: /somepath/resources/views/page/default.blade.php)

这是真的,因为我的缓存文件夹中只有一个视图:

// 5b27802352643346357e49b847d934736c36cd07.php
// The main view with the field view
<?php $__env->startSection('main_content'); ?>

    Get to the choppa!

<?php $__env->stopSection(); ?>

我第二次运行它,它神奇地起作用。它将生成3个其他文件:

// b30c24f5b8fd420ef1a08edb52e92174e2dfe911.php
// the main view with yielding layout view without field view
<?php $__env->startSection('main_content'); ?>

<?php $__env->stopSection(); ?>

<?php echo $__env->make('layout.default', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?>

// e4cec91e7d4adb5dac5c63e5bfa85ba9a258f664.php
// the layout file
// ...
<?php endforeach; $__env->popLoop(); $loop = $__env->getFirstLoop(); ?>
// ...

// ffd60653d8490007c272c527abef3a5ede092a33.php
// layout view and main view
// ...
<?php $__env->startSection('main_content'); ?>

<?php echo $__env->yieldSection(); ?>
// ...

看起来它生成两个相同但没有视野的文件。

2 return Blade::compileString('{!! view("lw::module.field.field")->render() !!}');

3 return Blade::compileString('@include("lw::module.field.field")');

这些方法将返回一个blanko页面并在缓存中生成两个文件,而不显示/记录任何错误。

// 5b27802352643346357e49b847d934736c36cd07.php
// Field view
Get to the choppa!

// b30c24f5b8fd420ef1a08edb52e92174e2dfe911.php
// Main view and field view
<?php $__env->startSection('main_content'); ?>

    <?php echo view("lw::module.field.field")->render(); ?>

<?php $__env->stopSection(); ?>

此方法不会生成布局文件。

有没有人知道发生了什么。也许这种行为并不奇怪,这就是Blade应该如何运作的。

1 个答案:

答案 0 :(得分:1)

我一直在研究一个项目,要求我做同样的事情,问题是当你想要渲染另一个视图时,制作一个新的Blade指令不是一个好习惯,因为Cache ,每个Blade指令都被缓存,所以如果你想渲染动态数据,它会给你带来很多问题。

由于我尝试了很多选项而你想渲染另一个视图文件而不只是将html推送到blade指令,我建议你创建一个新的帮助器甚至是一个可以传递参数的服务。将返回输出干净HTML的渲染函数,这样您就可以确保您的内容始终是动态的,并且不会被缓存。

TL; DR

示例:

在你的助手函数文件中输入:

function render_my_view() {
    return view(''lw::module.field.field'')->render();
}

然后在你的刀片文件中你可以使用:

{!! render_my_view() !!}