web-dev-qa-db-fra.com

Comment fonctionnent les opérateurs de comparaison de chaînes dans Twig?

Comment est-ce possible? Cela semble être un problème très très étrange (sauf si je manque quelque chose de très simple):

Code:

{{ dump(nav) }}
{% if nav == "top" %}
    <div class="well">This would be the nav</div>
{% endif %}

Sortie:

boolean true
<div class="well">This would be the nav</div>

Screenshot

Fondamentalement, la sortie est vraie, mais elle n'est pas censée vérifier la vérité.

31
Scottymeuk

Ceci est facilement reproductible:

{% set nav = true %}
{% if nav == "top" %}
ok
{% endif %}

Affiche ok.

Selon la documentation :

Twig permet des expressions partout. Celles-ci fonctionnent très similaires aux PHP habituelles et même si vous ne travaillez pas avec PHP, vous devriez vous sentir à l'aise.

Et si vous testez en PHP pur l'expression suivante:

$var = true;
if ($var == "top") {
  echo 'ok';
}

Il affichera également ok.

Le fait est que vous ne devez pas comparer des variables de types différents. Ici, vous comparez un booléen avec une chaîne: si votre chaîne n'est pas vide ou si elle ne contient que des zéros, elle sera évaluée à vrai.

Vous pouvez également consulter le manuel PHP pour voir comment les comparaisons sont faites avec différents types.

Modifier

Vous pouvez utiliser le test sameas pour effectuer des comparaisons strictes et éviter les problèmes de jonglage de type.

40
Alain Tiemblo