使用变量访问 laravel 项目的 blade 文件中的对象属性

Using variables to access object property in blade file of laravel project

提问人:Yeo Bryan 提问时间:11/8/2023 更新时间:11/8/2023 访问量:36

问:

给定以下 PHP 对象和变量

$options = { 'options' : { '0' : 'Off' , '1' : 'On' }}
$data->{$row->field}} = 0 or 1

语法错误方法

为什么我无法通过对象变量直接调用对象的“0”和“1”属性来访问对象的“0”和“1”属性,例如以的形式。这将导致错误“解析错误:语法错误,意外的')'$options->options<span class="label label-info"> {{ $options->options->{$data->{$row->field}} }}"

解决方法 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}} !!}

为什么第一种方法会导致语法错误,而 2 种解决方法有效?

php laravel 对象 laravel-5 laravel-blade

评论

1赞 apokryfos 11/8/2023
我猜这是因为被刀片替换了,因为在刀片中是.使用有用吗?}});?>{{ $something }}<?php echo e($something); ?><?= $options->options->{$data->{$row->field}}; ?>

答:

-1赞 Adi 11/8/2023 #1

所以我很确定这可能会在 Stackoverflow 或文档的某个地方提到。但我仍然可以尝试。
语法错误方法
Blade 模板引擎设计为默认安全,因此它默认转义输出以防止跨站点脚本 (XSS) 攻击。因此,当您尝试使用 访问嵌套属性时,Blade 可能会错误地解释它,从而导致语法错误。
$options->options->{$data->{$row->field}}


解决方法解决方案 1
通过将结果分配给中间变量,可以将操作分解为多个步骤,从而使 Blade 能够正确解释它,因为它可以处理中间变量而不会造成混淆。
$data->{$row->field}


解决方法解决方案 2
使用语法,该语法按原样输出内容,而不转义特殊字符。虽然这可行,但如果内容没有得到适当的审查或信任,就会有安全问题,因为它绕过了 Laravel 的默认转义机制。(如果您正在处理用户生成的内容或可能包含潜在有害输入的内容,则通常不建议这样做)。
{!! !!}