Laravel Blade, 通过@include传递一个函数而不检查它是否存在于主视图中
Laravel Blade, Pass a function through @include without checking if it exists in main view
我正在学习 Laravel(和 php)并在 blade 中创建视图。因为我会有许多非常相似的视图,所以我想在可重用文件中保留尽可能多的格式,我将一些变量传递给这些文件以针对每个文件进行自定义。这在大多数情况下运行良好,但当我需要将函数传递给包含的视图时失败。
show.blade
@include('_twocol_row_content',
[
'field' => 'Content',
'value' => $entry->blocks,
'interface' => blockDisplay()
])
_twocol_row_content.blade
@extends('_twoCol_row_base')
@section('field')
{{ $field }}
@overwrite
@section('value')
@foreach ($value as $instance)
<p>{{ $instance->$interface }}</p>
@endforeach
@overwrite
这在 $interface 有直接关系并且可以作为字符串传递时有效(例如 'title'),但在传递函数时失败并出现“调用未定义函数错误”,因为函数仅在 foreach 循环开始后定义。我已经尝试了所有我能想到的方法,并在互联网上进行了搜索,但还没有找到让它发挥作用的方法。如果我将每个循环的整体直接放在视图中,内容将正确呈现,但我失去了作为包含文件的一部分的所有格式的好处。
我试过:
- 封装为字符串(例如'blockDisplay()'),呈现视图,但不呈现 foreach 循环内容。
- 包装在一个 isset 中,它在其他领域工作但失败,因为无法用它们评估函数
- 将函数名称作为字符串传递,然后将其连接到括号中,将其定义为包含文件中的函数(与上面的字符串函数相同)
编辑
- 将 _twocol_row_content.blade 更改为仅查找
{{ $interface }}
并将 $instance 变量作为 $instance->blockDisplay() 传递失败,因为实例不是定义。在 isset 中包装 $instance 呈现页面而不是内容。
如何在不失去在单个文件中定义包装 html 的好处的情况下呈现任何自定义函数?
你可以试试这个
使用此调用 object/collection 值:$variable->{$field}
或object/collection有方法:$variable->{method}()
我正在学习 Laravel(和 php)并在 blade 中创建视图。因为我会有许多非常相似的视图,所以我想在可重用文件中保留尽可能多的格式,我将一些变量传递给这些文件以针对每个文件进行自定义。这在大多数情况下运行良好,但当我需要将函数传递给包含的视图时失败。
show.blade
@include('_twocol_row_content',
[
'field' => 'Content',
'value' => $entry->blocks,
'interface' => blockDisplay()
])
_twocol_row_content.blade
@extends('_twoCol_row_base')
@section('field')
{{ $field }}
@overwrite
@section('value')
@foreach ($value as $instance)
<p>{{ $instance->$interface }}</p>
@endforeach
@overwrite
这在 $interface 有直接关系并且可以作为字符串传递时有效(例如 'title'),但在传递函数时失败并出现“调用未定义函数错误”,因为函数仅在 foreach 循环开始后定义。我已经尝试了所有我能想到的方法,并在互联网上进行了搜索,但还没有找到让它发挥作用的方法。如果我将每个循环的整体直接放在视图中,内容将正确呈现,但我失去了作为包含文件的一部分的所有格式的好处。
我试过:
- 封装为字符串(例如'blockDisplay()'),呈现视图,但不呈现 foreach 循环内容。
- 包装在一个 isset 中,它在其他领域工作但失败,因为无法用它们评估函数
- 将函数名称作为字符串传递,然后将其连接到括号中,将其定义为包含文件中的函数(与上面的字符串函数相同) 编辑
- 将 _twocol_row_content.blade 更改为仅查找
{{ $interface }}
并将 $instance 变量作为 $instance->blockDisplay() 传递失败,因为实例不是定义。在 isset 中包装 $instance 呈现页面而不是内容。
如何在不失去在单个文件中定义包装 html 的好处的情况下呈现任何自定义函数?
你可以试试这个
使用此调用 object/collection 值:$variable->{$field}
或object/collection有方法:$variable->{method}()