给定以下PHP对象和变量
$options = { 'options' : { '0' : 'Off' , '1' : 'On' }}
$data->{$row->field}} = 0 or 1
字符串
错误方法
为什么我不能通过直接通过对象变量(如<span class="label label-info"> {{ $options->options->{$data->{$row->field}} }}
形式)调用$options->options
对象的“0”和“1”属性。这将导致错误“Parse error:syntax error,unexpected '错误'”
解决方案1
但是,如果在通过中间变量从对象调用属性之前创建一个中间变量来存储$data->{$row->field};
,则可以正常工作
@php
$enable_company_logo_white_label = $data->{$row->field};
@endphp
{{-- Working Code --}}
<span class="label label-info"> {{ $options->options->{$enable_company_logo_white_label} }}</span>
型
解决方案2
另一种解决方法是调用{!! $options->options->{$data->{$row->field}} !!}
,而不转义特殊字符
为什么第一种方法会导致语法错误,而第二种解决方案可以工作?
1条答案
按热度按时间c8ib6hqw1#
所以我很确定这可能在Stackoverflow或文档的某个地方提到过。但我仍然可以尝试。
错误方法
Blade模板引擎设计为默认安全,因此默认情况下会转义输出以防止跨站脚本(XSS)攻击。因此,当您尝试使用
$options->options->{$data->{$row->field}}
访问嵌套属性时,Blade可能会错误地解释它,从而导致语法错误。解决方案1
通过将
$data->{$row->field}
的结果赋给一个中间变量,您可以将操作分解为多个步骤,从而使Blade能够正确地解释它,因为它可以处理中间变量而不会混淆。解决方案2
您使用
{!! !!}
语法,它输出内容时不使用特殊字符进行转义。虽然这可以工作,但如果内容没有正确消毒或信任,就会产生安全问题,因为它绕过了Laravel的默认转义机制。(如果您正在处理用户生成的内容或可能包含潜在有害输入的内容,通常不建议使用)。