Twig instanceof pour l'héritage des objets
Je suis à l'aide de la fonctionnalité suivante de propulser http://www.propelorm.org/documentation/09-inheritance.html.
Je suis également en utilisant Symfony2 et Twig
J'ai une structure de classe à l'aide de la fonction ci-dessus qui ressemble à quelque chose comme ceci
class Event {}
class Birthday extends Event {}
class Walking extends Event {}
maintenant je passe un objet d'événement d'un template twig et je veux savoir quel type d'événement il est
Par exemple je veux afficher une image d'un gâteau de son anniversaire et je veux afficher la carte des itinéraires si sa marche événement.
Je ne peux pas utiliser instanceof dans Twig, car cette fonctionnalité n'existe pas.
Quelqu'un maintenant, pourquoi cela n'existe pas?
et est-il un moyen pour que je puisse répliquer cette fonctionnalité sans avoir à faire quelque chose comme
public function getType()
dans chaque classe, ou
public function isBirthday()
dans le cas de la classe.
J'ai trouvé ceci sur github, mais n'est d'aucune utilité pour moi. J'ai fait des commentaires sur leurs pour voir si je peux obtenir une réponse.
https://github.com/fabpot/Twig/issues/553
Vous devez vous connecter pour publier un commentaire.
Je partage l'opinion, que
instanceof
est rien de ce qui doit apparaître dans un modèle. J'utilise twig-tests pour ce casEt dans le modèle
\Twig_Test
, ou est-il un alias à une autre classe?\Twig_Test
lui-même est abstraite et donc uninstantiatable.\Twig_SimpleTest
fonctionne à la place deTwigTest
ci-dessus. Voir: twig.sensiolabs.org/doc/advanced.html#testsuse \Twig_Test as TwigTest; // or even "as Test"
(et il a été copié et collé à partir de quelque part). Il s'intègre mieux dans l'ensemble du style de codageUne façon indirecte d'y parvenir serait de tester l'objet d'une méthode, si vous savez que chaque objet hérité a une méthode unique. Peut-être que votre date d'Anniversaire de catégorie a d'une getBirthday(), tandis que la Marche à la classe a un getMap()?
.method
getter ajouté par Twig pour chaque objet. Donc, tant queyourobject
n'ont pas réellement une méthode appelée "méthode" vous l'expression ne sera jamais vrai. Au lieu d'utiliser simplement{% if yourObject.methodName is defined %}
où "methodName" est le nom exact de la fonction vous êtes à vérifier.Utiliser instanceof dans un modèle, c'est mal vu à partir d'un point de vue architectural. Si vous vous trouvez dans une situation où vous avez "besoin", vous avez probablement découvert un problème dans votre architecture. Votre getType solution dans votre cas est probablement le meilleur. Vous pouvez toujours le mettre que dans le cas de la classe de base et de lire le nom de la mise en œuvre de la classe.
Une autre solution :
puis ça fonctionne avec n'importe quelle classe qui hérite de
puis dans votre twig :
OU
Je suis en train de faire un index.html.twig qui dresse la liste des entités qui sont définis par l'utilisateur, et uniquement les champs qui ont été marqués comme
'addToListing'
j'ai Donc arriver au point où je ne sais pas ce que je suis à l'impression.Et à la tête d'un \DateTime :/Donc, pour ce cas, j'avais besoin d' | date('format') ou d'une meilleure solution.
Tout conseiller sur une solution propre pour moi?
if entity.format is defined
devrait faire l'affaire!{% if bridge.is_scalar(attribute(entity, heading)) or attribute(entity, heading).__toString is defined or attribute(entity, heading) is null %} {{ attribute(entity, heading) ? : 'empty'}} {% else %} {% if bridge.get_class(attribute(entity, heading)) == 'DateTime' %} {#{ dump(bridge.get_class(attribute(entity, heading))) }#} {{ attribute(entity, heading) | date(dateFormat) }} {% else %} {% endif %} {% endif %}
namespace DocDigital\Bundle\DocumentBundle\Helper; /** * Nasty stuff to support needed php fns in twig * * @author Juan Manuel Fernandez <[email protected]> */ class TwigPhpBridge { public function __call($functionName, array $argV) { return call_user_func_array($functionName, $argV); } }
J'ai eu le même problème, il est lié à l'héritage dans l'Hôtel de logiciels. J'ai eu une classe de base "RoomEquipment", et l'héritage avec les "Lit", "ElectricAppliances"....
Et bien sûr, une classe de "Chambre" avec une relation OneToMany vers RoomEquipment.
Sur le modèle, j'ai voulu rendre lits seulement, mais la Chambre a rapport à l'équipement de base, qui comprend des lits et des appareils électriques.
Au lieu de tester dans le template twig, dans la Salle de classe, j'ai créé une méthode getBeds, et c'est tout.
Et, bien sûr, dans Twig:
Grâce à la Propriété de l'Accesseur de composant, c'est possible. Maintenant, votre brindille n'a pas à vérifier sur le type d'instance, ni il n'a pas de