symfony 如何检查细枝布线中未定义/未设置的参数?

pu82cl6c  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(94)

我正在使用symfony 5/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'))前面放一个isset,然后它就会停止检查,但是很明显,twig会检查所有的条件。
我试着加上这个:已定义应用程序请求属性获取(“类型”),并且
例如

<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>

但这没有用,错误仍然是:
无法访问空变量的属性(“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}) }}">
jgovgodb

jgovgodb1#

对于此用例,您可以简单地使用过滤器default

{% if app.request.get('_route') == 'app_support_case_new' and app.request.attributes.get('type')|default == 1 %}active{% endif %}

仅供参考:测试defined不考虑nullable值,其行为与PHP中的isset不同。这是因为测试defined在后台使用array_key_exists。请参阅下面的代码片段
x一个一个一个一个x一个一个二个x
demo
一个三个三个一个
demo

相关问题