如何检查树枝路由中未定义/未设置的参数?

How to check for parameter not defined/not set in twig route?

提问人:Matt Welander 提问时间:2/14/2023 更新时间:2/14/2023 访问量:101

问:

我正在使用 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}) }}">
symfony 路由 参数 twig isset

评论

0赞 AymDev 2/14/2023
搜索了空安全运算符,但看起来仍未实现
0赞 DarkBee 2/14/2023
@AymDev:这不是真的 - 演示
0赞 AymDev 2/14/2023
@DarkBee是的,您的演示使用了 null 合并运算符,而 nullsafe 运算符会导致 Twig 语法错误。foo?.bar
0赞 DarkBee 2/14/2023
@AmyDev:我的错,但除了“优化”之外,它的行为方式是一样的。

答:

-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不同。这是因为测试在后台使用。请参阅下面的代码片段definednullableissetdefinedarray_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

演示