symfony propel twig single-table-inheritance

symfony - twig manual



Twig instanceof para objetos de herencia (6)

Comparto la opinión, esa instanceof no es nada que debería aparecer en una plantilla. Yo uso pruebas de ramitas para este caso

class MyTwigExtension extends TwigExtension { public function getTests () { return [ new /Twig_SimpleTest(''birthday'', function (Event $event) { return $event instanceof Birthday; }), new /Twig_SimpleTest(''walking'', function (Event $event) { return $event instanceof Walking; }) ]; } }

Y en la plantilla

{% if event is birthday %}{# do something #}{% endif %}

Estoy utilizando la siguiente función de propel http://www.propelorm.org/documentation/09-inheritance.html .

También estoy usando Symfony2 y Twig

Tengo una estructura de clase que utiliza la característica anterior que se parece a esto

class Event {} class Birthday extends Event {} class Walking extends Event {}

Ahora paso un objeto de evento a una plantilla de ramita y quiero saber qué tipo de evento es

Por ejemplo, quiero mostrar una imagen de un pastel si es un cumpleaños y quiero mostrar las rutas del mapa si es un evento de caminata.

No puedo usar instanceof en Twig ya que esta característica no existe. ¿Alguien ahora por qué esto no existe? y ¿hay alguna manera de poder replicar esta funcionalidad sin tener que hacer algo como

public function getType()

en cada clase, o

public function isBirthday()

en la clase de evento.

Encontré esto en github pero no me sirve. He comentado en su para ver si puedo obtener una respuesta.

https://github.com/fabpot/Twig/issues/553


El uso de instanceof en una plantilla está mal visto desde un punto de vista arquitectónico. Si se encuentra en una posición en la que lo "necesita", probablemente haya descubierto un problema en su arquitectura. Su solución getType en su caso es probablemente la mejor. Aún podría poner eso en la clase base de eventos y leerlo en voz alta el nombre de la clase implementadora.


Estoy intentando hacer un index.html.twig que enumera las entidades definidas por el usuario, y solo los campos que se han marcado como ''addToListing'' lo que llego al punto en el que no sé lo que hago '' impresión m

{% for entity in entities %} <tr> {% for heading in headings %} <td><a href="{{ path(''document_show'', { ''id'': entity.id, docType: metaData.className }) }}">{{ attribute(entity, heading) }}</a></td> {% endfor %} </tr> {% endfor %}

Y el encabezado pasa a ser un / DateTime: / Así que para tal caso necesitaría | Fecha (''formato'') o alguna solución mejor.

¿Algún consejo sobre una solución limpia para mí?


Otra solución :

class Event { ... public function isInstanceOfBirthday() { return $this instanceof Birthday; } }

entonces funcionará con cualquier clase que herede de

class Birthday extends Event {} class Walking extends Event {}

entonces en tu ramita:

{{ event.isInstanceOfBirthday ? ... something for Birthday instance ... : ... something for Walking instance ... }}

O

{% if event.isInstanceOfBirthday %} ... do something for Birthday instance ... {% else %} ... do something for Walking instance ... {% endif %}


Tuve un problema similar, estaba relacionado con la herencia en el software del hotel. Tuve una clase base "RoomEquipment", y la herencia con "Bed", "ElectricAppliances" ...

class BaseRoomEquipment {} class Bed extends BaseRoomEquipment {} class ElectricAppliances extends BaseRoomEquipment {}

Y, por supuesto, una clase "Habitación" con relación OneToMany hacia RoomEquipment.

En la plantilla, solo quería hacer camas, pero la habitación tiene relación con el equipo base, que incluye camas y electrodomésticos.

En lugar de probar en la plantilla de ramita, en la clase de sala he creado un método getBeds, y eso es todo.

class Room { private $equipment; public getBeds() { $res = []; foreach($this->getEquipment() as $eq) { if ($eq instanceof Bed) $res[] = $eq; } return $res; } // Rest of class here.... }

Y, por supuesto, en Twig:

<div> {% for Bed in Room.beds %} {{ Bed.nbPersons }} {% endfor %} </div>

Gracias al componente Property Accessor - esto es posible. Ahora, tu ramita no tiene que verificar el tipo de instancia, ni tampoco lo hace


Una forma indirecta de lograr esto sería probar el objeto para un método, si sabe que cada objeto heredado tiene un método único. ¿Quizás tu clase de cumpleaños tiene un getBirthday (), mientras que tu clase de caminata tiene un getMap ()?

{% if yourobject.methodName is defined %} //Stuff that should only output when the object in question has the requested method {% endif %}