20

私はpropelhttp://www.propelorm.org/documentation/09-inheritance.htmlから次の機能を使用しています

Symfony2とTwigも使用しています

上記の機能を使用したクラス構造は次のようになります

class Event {}

class Birthday extends Event {}

class Walking extends Event {}

ここで、イベントオブジェクトを小枝テンプレートに渡します。それがどのタイプのイベントであるかを知りたいです。

たとえば、誕生日の場合はケーキの画像を表示し、ウォーキングイベントの場合は地図のルートを表示したいとします。

この機能が存在しないため、Twigでinstanceofを使用できません。なぜこれが存在しないのですか?そして、次のようなことをしなくても、この機能を複製できる方法はありますか?

 public function getType()

各クラスで、または

 public function isBirthday()

イベントクラスで。

私はこれをgithubで見つけましたが、私には役に立ちません。私は彼らにコメントして、私が答えを得ることができるかどうかを確認しました。

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

4

6 に答える 6

55

私は意見を共有します、それinstanceofはテンプレートに表示されるべきものではありません。この場合、小枝テストを使用します

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; })
        ];
    }
}

そしてテンプレートで

{% if event is birthday %}{# do something #}{% endif %}
于 2013-09-11T21:30:45.880 に答える
6

これを実現する間接的な方法は、継承された各オブジェクトに一意のメソッドがあることがわかっている場合、オブジェクトのメソッドをテストすることです。おそらく、BirthdayクラスにはgetBirthday()があり、WalkingクラスにはgetMap()がありますか?

{% if yourobject.methodName is defined %}
   //Stuff that should only output when the object in question has the requested method
{% endif %}
于 2013-05-29T10:51:20.507 に答える
4

テンプレートでinstanceofを使用することは、アーキテクチャの観点からは嫌われています。「必要な」位置にいる場合は、アーキテクチャの問題を発見した可能性があります。あなたの場合のgetTypeソリューションはおそらく最高です。それでも、それをイベント基本クラスに入れて、実装クラスの名前を読み取ることができます。

于 2012-04-12T10:01:02.847 に答える
1

別の解決策:

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

その後、から継承するすべてのクラスで動作します

class Birthday extends Event {}

class Walking extends Event {}

それからあなたの小枝で:

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

また

{% if event.isInstanceOfBirthday %}
    ... do something for Birthday instance ...
{% else %}
    ... do something for Walking instance ...
{% endif %}
于 2017-01-16T15:19:22.797 に答える
0

ユーザーによって定義されたエンティティと、マークされたフィールドのみを一覧表示するindex.html.twigを作成しようとしています。その'addToListing'ため、何を印刷しているのかわからない状態になります。

{% 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 %}

そして、見出しはたまたま\ DateTime:/なので、そのような場合は| date('format')またはより良い解決策。

私のためのクリーンな解決策について何かアドバイスはありますか?

于 2014-01-11T00:08:48.843 に答える
0

私も同様の問題を抱えていました。それはホテルのソフトウェアの継承に関連していました。基本クラスは「RoomEquipment」で、継承は「Bed」、「ElectricAppliances」でした。

class BaseRoomEquipment {}

class Bed extends BaseRoomEquipment {}

class ElectricAppliances extends BaseRoomEquipment {}

そしてもちろん、RoomEquipmentに対してOneToManyの関係を持つクラス「Room」。

テンプレートでは、ベッドのみをレンダリングしたかったのですが、部屋はベッドや電化製品などの基本的な機器と関係があります。

小枝テンプレートでテストする代わりに、RoomクラスでgetBedsメソッドを作成しました。

class Room {

  private $equipment;

  public getBeds() 
  {
     $res = [];
     foreach($this->getEquipment() as $eq) {
        if ($eq instanceof Bed) $res[] = $eq;
     }
     return $res;
  }

  // Rest of class here....

}

そして、もちろん、Twigでは:

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

プロパティアクセサーコンポーネントのおかげで-これは可能です。これで、小枝はインスタンスタイプをチェックする必要がなくなり、また、インスタンスタイプをチェックする必要もありません。

于 2014-06-12T09:01:28.837 に答える