提问人:Matt Welander 提问时间:2/14/2023 更新时间:2/14/2023 访问量:101
如何检查树枝路由中未定义/未设置的参数?
How to check for parameter not defined/not set in twig route?
问:
我正在使用 symfony5/twig,我想在菜单项处于活动状态(当前路由)时突出显示它。
我正在检查路由参数,如下图所示,但我还没有找到处理未传递参数的情况的方法(它是可选的)。
只要使用带参数的路由,下面的代码就可以正常工作,但是一旦使用了带参数的路由,当它尝试检查 app.request.attributes.get('type').id 时会抛出错误,因为显然 app.request.attributes.get('type') 是 null,因此没有属性 'id'。
<li>
<a class="{% if app.request.get('_route') == 'app_support_case_new' and app.request.query.get('type') is not defined %}active{% endif %}" href="{{ path('app_support_case_new') }}">
<span class="glyphicon glyphicon-plus glyphicon-plus" aria-hidden="true"></span> No topic
</a>
</li>
<li>
<a class="{% if app.request.get('_route') == 'app_support_case_new' and app.request.attributes.get('type').id == 1 %}active{% endif %}" href="{{ path('app_support_case_new', {'type':1}) }}">
<span class="glyphicon glyphicon-plus glyphicon-user" aria-hidden="true"></span> Staff <i class="glyphicon glyphicon-random opacity50"></i>
</a>
</li>
<li>
<a class="{% if app.request.get('_route') == 'app_support_case_new' and app.request.attributes.get('type').id == 2 %}active{% endif %}" href="{{ path('app_support_case_new', {'type':2}) }}">
<span class="glyphicon glyphicon-shopping-cart" aria-hidden="true"></span> Order
</a>
</li>
在 php 中,我会在条件中将 isset(app.request.attributes.get('type')) 放在它之前,它会在那里停止检查。但显然,无论如何,树枝都会检查所有条件。
我试过添加这个: app.request.attributes.get('type') 和
如
<li>
<a class="{% if app.request.get('_route') == 'app_support_case_new' and app.request.attributes.get('type') is defined and app.request.attributes.get('type').id == 1 %}active{% endif %}" href="{{ path('app_support_case_new', {'type':1}) }}">
<span class="glyphicon glyphicon-plus glyphicon-user" aria-hidden="true"></span> Staff <i class="glyphicon glyphicon-random opacity50"></i>
</a>
</li>
但这无济于事。错误仍然是:
无法访问 null 变量上的属性 (“id”)。
<a class="{% if app.request.get('_route') == 'app_support_case_new' and app.request.attributes.get('type') is defined and app.request.attributes.get('type').id == 1 %}active{%endif %}" href="{{ path('app_support_case_new', {'type':1}) }}">
答:
-1赞
DarkBee
2/14/2023
#1
对于此用例,您可以简单地使用过滤器默认值
{% if app.request.get('_route') == 'app_support_case_new' and app.request.attributes.get('type')|default == 1 %}active{% endif %}
仅供参考:该测试不考虑值,其行为与PHP不同。这是因为测试在后台使用。请参阅下面的代码片段defined
nullable
isset
defined
array_key_exists
// line 2
echo ((array_key_exists("foo", $context)) ? (1) : (0));
{% set foo = null %}
{{ foo is defined ? 1 : 0 }} {# 1 #}
{{ foo ? 1 : 0 }} {# 0 #}
{% set foo = false %}
{{ foo is defined ? 1 : 0 }} {# 1 #}
{{ foo ? 1 : 0 }} {# 0 #}
{% set foo = 0 %}
{{ foo is defined ? 1 : 0 }} {# 1 #}
{{ foo ? 1 : 0 }} {# 0 #}
<?php
$foo = null;
echo (isset($foo) ? 1 : 0).PHP_EOL;
echo ($foo ? 1 : 0).PHP_EOL;
$foo = false;
echo (isset($foo) ? 1 : 0).PHP_EOL;
echo ($foo ? 1 : 0).PHP_EOL;
$foo = 0;
echo (isset($foo) ? 1 : 0).PHP_EOL;
echo ($foo ? 1 : 0).PHP_EOL;
0
0
1
0
1
0
评论
foo?.bar