【发布时间】:2017-06-27 23:38:07
【问题描述】:
目前我正在开发一个需要通过自定义 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")');
这些方法将返回一个空白页面并在缓存中生成两个文件,而不会显示/记录任何错误。
// 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 应该是这样工作的。
【问题讨论】:
标签: laravel view render blade directive