如何将 Laravel (5.2) isset 与包含变量的 href 一起使用?

How do I use Laravel (5.2) isset with an an href which contains a variable?

我正在尝试在我的 Blade 视图中使用 isset(),如果设置了该值,则显示包含变量值的 href

我正在使用 {!! !!} 来让它工作,但是 URL 中的 {{ }} 显示为原始 HTML。这是可以理解的,但不是我需要的。

{!! isset($scenario->bpmn) ? '<a href="{{ url($scenario->bpmn) }}" target="_blank"><i class="fa fa-file-image-o" aria-hidden="true"></i></a>' : '' !!}

有办法吗?

我们不能将 {{ ... }}{!! ... !!} 表达式嵌套在另一个表达式中,因为 Blade 会将它们重写为类似于以下(简化的)示例的输出语句:

echo isset($scenario->bpmn) ? '<a href="{{ url($scenario->bpmn) }}">...</a>' : '';

正如我们所见,Blade 不会递归地呈现这些输出语句。相反,使用字符串连接:

{!! isset($scenario->bpmn) ? '<a href="' . url($scenario->bpmn) . '">...</a>' : '' !!}

或者,使用 @if 指令,它允许我们包含占位符表达式:

@if (isset($scenario->bpmn))
    <a href="{{ url($scenario->bpmn) }}">...</a>
@endif

这避免了使用未转义的 {!! ... !!} 输出,如果 $scenario->bpmn 包含用户输入,这有助于防止 XSS 攻击。

对我来说,唯一合理的方法是像这样使用 @if 指令:

@if (isset($scenario->bpmn)) 
  <a href="{{ url($scenario->bpmn) }}" target="_blank"><i class="fa fa-file-image-o" aria-hidden="true"></i></a>
@endif

看文件内容也会更容易阅读