php Laravel项目中使用变量访问Blade文件中的对象属性

r1zhe5dt  于 2023-11-16  发布在  PHP
关注(0)|答案(1)|浏览(147)

给定以下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}} !!},而不转义特殊字符

为什么第一种方法会导致语法错误,而第二种解决方案可以工作?

c8ib6hqw

c8ib6hqw1#

所以我很确定这可能在Stackoverflow或文档的某个地方提到过。但我仍然可以尝试。

错误方法

Blade模板引擎设计为默认安全,因此默认情况下会转义输出以防止跨站脚本(XSS)攻击。因此,当您尝试使用$options->options->{$data->{$row->field}}访问嵌套属性时,Blade可能会错误地解释它,从而导致语法错误。

解决方案1

通过将$data->{$row->field}的结果赋给一个中间变量,您可以将操作分解为多个步骤,从而使Blade能够正确地解释它,因为它可以处理中间变量而不会混淆。

解决方案2

您使用{!! !!}语法,它输出内容时不使用特殊字符进行转义。虽然这可以工作,但如果内容没有正确消毒或信任,就会产生安全问题,因为它绕过了Laravel的默认转义机制。(如果您正在处理用户生成的内容或可能包含潜在有害输入的内容,通常不建议使用)。

相关问题