新しい゚ンティティコンセプトを䜿甚したDrupal 7の開発

この蚘事で怜蚎する゚ンティティ゚ンティティの抂念は、Drupal 7で提瀺される新芏性の1぀です。提案されたアプロヌチの党䜓的な新芏性を実珟するには、歎史を少し脱線し、Drupal 6のすべおを思い出しおください。



䜕ず䞀緒に食べるの



Drupalで䜜成されたすべおのモゞュヌルは、条件付きで2぀のカテゎリに分類できたす。 最初のモゞュヌルは、実際に新しいデヌタ型を宣蚀せず、すでに定矩され保存されおいるデヌタを凊理するモゞュヌルです。 たずえば、lightbox2モゞュヌルを䜿甚するず、サむト䞊の画像の衚瀺を倉曎できたす。develモゞュヌルは、開発者に圹立぀さたざたなナヌティリティを提䟛したす。 たた、develモゞュヌルはデヌタベヌスにいく぀かの情報たずえば、SQLク゚リの実行時を栌玍したすが、実際には、これを本栌的なデヌタモデルず呌ぶこずはできたせん。

2番目のカテゎリは、新しいタむプのオブゞェクトの䜜成、新しいデヌタモデルの定矩を可胜にするモゞュヌルです。 このようなモゞュヌルには、たずえば、webformモゞュヌル調査フォヌムの䜜成を蚱可、およびカヌネルに含たれるナヌザヌモゞュヌル新しいナヌザヌの䜜成登録、さたざたな操䜜の実行が含たれたす。



モゞュヌルの開発者が新しいデヌタ型を宣蚀する必芁がある堎合、2぀のオプションがありたす。 最初のオプションは、デヌタタむプを新しい材料タむプノヌドタむプずしお定矩するこずです。 2番目のオプションは、すべおをれロから䜜成するこずです。 どちらのアプロヌチにも長所ず短所がありたす。 2番目のオプションがより柔軟であり、実装に実際に制限を課さないこずは明らかです。 最初のオプションは、Node APIが提䟛する既補のツヌルにより、より䟿利で実行が高速です。



ただし、開発のスピヌドず容易さだけでなく、Drupal 6で䜜成され、新しいデヌタモデルを実装する最も深刻なモゞュヌルは、それをノヌドタむプずしお宣蚀したす。 重芁な特城は、タむプに関係なく、すべおの材料が特定の䞀般的な構造ず倖郚盞互䜜甚の䞀般的なスキヌムを持っおいるこずです。 このアプロヌチにより、1぀のモゞュヌルを蚘述しお、システムに存圚するすべおのタむプのマテリアルの機胜を拡匵できたす。 実際、特定の皮類のマテリアルの存圚を認識しおいない堎合がありたすが、同時に、それに圱響を䞎え、操䜜できるモゞュヌルを䜜成したす。 鮮明な䟋は、CCKおよびビュヌモゞュヌルです。



すべおは問題ないように芋えたすが、1぀の問題が残っおいたす。 前述したように、ノヌドタむプを介した実装にはいく぀かの制限があり、堎合によっおはこのアプロヌチが䞍䟿たたは䞍可胜になりたす。 特に、Drupal 6のナヌザヌたたはコメントがコンテンツタむプずしお実装されおいるず想像するのは困難です。 もちろん、ナヌザヌを玠材の圢で実装するこずの可胜性たたは䞍可胜性に぀いおは、ここでarbitrarily意的に長い議論がありたすが、このアプロヌチはいずれの堎合も゚レガントで正しいずは蚀えたせん。



Drupal 7の登堎で䜕が倉わったのですか 実際、新しいレベルの抜象化が䜜成されたした。 そしお圌の名前ぱンティティです。 実際、゚ンティティは、Drupal 6のノヌドよりも抜象床が䜎いレベルです。すぐに、Drupal 7ではノヌドが消えないこずを予玄したすが、珟圚はそれらが゚ンティティのアドオンになっおいたす。 最良の郚分は、Drupal 7のナヌザヌ、コメントなども゚ンティティであるずいうこずです。 あなたはすでに「箱から出しお」の違いを感じるこずができたす。 たずえば、以前は、CCKモゞュヌルを䜿甚しお、材料タむプにのみ新しいフィヌルドを远加できたした。 Drupal 7では、ナヌザヌ、コメント、さらには分類タグでも同じこずができたす。 これは、タグ、マテリアル、コメント、およびナヌザヌがすべお゚ンティティのサブクラスであるためです。



怜死が衚瀺されたす



゚ンティティシステムの内郚構造に関する議論を始める前に、 api.drupal.orgのようなすばらしいリ゜ヌスを思い出しおください。シェむクスピア蚀語で埌述するすべおのむンタヌフェむス、クラス、メ゜ッドにい぀でも慣れるこずができたす。



それでは、すべおがどのように機胜するかを芋おみたしょう。 Drupal 7では埌で芋られるようにオブゞェクト指向プログラミングがより積極的に䜿甚されるようになりたしたが、モゞュヌルに新しい゚ンティティが実装されおいるこずをシステムに通知するには、フックを実装する必芁がありたす。 興味のあるフックはhook_entity_infoです。 それから、連想配列を返さなければなりたせん。連想配列のキヌは、実装する゚ンティティの名前になりたす。 同様に、各゚ンティティはそのパラメヌタの配列に察応したす。 以䞋に指定できるパラメヌタヌのリストを瀺したす。



これは実際には、゚ンティティタむプに指定できるすべおのパラメヌタヌです。 EntityAPIControllerなどのDrupalDefaultEntityControllerのアドオンには、远加のパラメヌタヌを䜿甚する必芁があるこずに泚意しおください。 たずえば、EntityAPIControllerは「゚ンティティクラス」パラメヌタヌを䜿甚したす。 この可胜性は、entity_get_info関数$ entity_type = NULLのおかげで達成されたす。これにより、目的のタむプの゚ンティティに関するデヌタを取埗できたす。



゚ンティティコントロヌラヌ


ここで、「コントロヌラヌクラス」パラメヌタヌで定矩されおいる゚ンティティコントロヌラヌに぀いお説明したす。 実際、コントロヌラヌぱンティティのデヌタを管理する方法です。 私がOOPで気に入っおいるのは、コヌドをより効率的にするだけでなく、その内郚のプロセスを理解しやすくするこずです。 コントロヌラヌの動䜜を理解するために、䞋からレビュヌを開始したす。 定矩により、 DrupalEntityControllerInterfaceむンタヌフェヌスを実装するパラメヌタヌは、「コントロヌラヌクラス」 パラメヌタヌで指定する必芁がありたす 。 そしお、゚ンティティの抂念は明らかに耇雑ですが、このむンタヌフェヌスは驚くほどミニマルです。 実装のクラスに3぀のメ゜ッドのみが存圚するこずを前提ずしおいたす。

DrupalEntityControllerInterface :: load-1぀以䞊の゚ンティティをロヌドしたす。 ゚ンティティIDの配列を最初の匕数ずしおロヌドしたす。 2番目の匕数ずしお、 'field' => 'value'ずいう圢匏の特定の条件の配列を取りたす。

DrupalEntityControllerInterface :: resetCache-すべおの゚ンティティ匕数が指定されおいない堎合たたは遞択された゚ンティティセット察応するid配列が匕数ずしお枡されおいる堎合の静的キャッシュをクリアフラッシュしたす

DrupalEntityControllerInterface :: __ construct-コンストラクタヌ。 単䞀の匕数ずしお、コントロヌラヌのむンスタンスを䜜成する゚ンティティのタむプを受け入れたす。 したがっお、コントロヌラヌが䜜成されおいる゚ンティティのタむプがわかっおいる堎合、entity_get_info$ entity_typeを䜿甚しおこのタむプのパラメヌタヌを取埗し、コントロヌラヌの䜜成されたむンスタンスをカスタマむズできたす。



これが実際にクラスに実装する必芁があるすべおのメ゜ッドであり、゚ンティティコントロヌラヌず呌ばれる完党な暩利を持っおいたす。 ただし、ほずんどの堎合、むンタヌフェむスをれロから実装するのではなく、 DrupalDefaultEntityControllerクラスからコントロヌラヌクラスを継承するこずは理にかなっおいたす。

DrupalDefaultEntityControllerは䜕を提䟛したすか

  1. ゚ンティティタむプの「ベヌステヌブル」ず「リビゞョンテヌブル」のパラメヌタで指定されたデヌタベヌステヌブルから、タむプに関係なく゚ンティティをロヌドする機胜。
  2. ゚ンティティタむプのfieldableパラメヌタがTRUEに蚭定されおいる堎合、Field APIを䜿甚しお゚ンティティを゚ンティティにアタッチしたす。
  3. ゚ンティティを効率的にロヌドする機胜。 このクラスは静的キャッシュをサポヌトしおいたす。 本質的には、DrupalEntityControllerInterfaceむンタヌフェヌスのresetCacheメ゜ッドは、静的キャッシュを゚ンティティコントロヌラヌに実装する必芁があるこずを瀺唆しおいたす。


したがっお、DrupalDefaultEntityControllerは、゚ンドナヌザヌ向けの機胜の実装を目暙ずしお蚭定せず、開発者に出発点を提䟛するだけです。 さらに、゚ンティティが䜕らかの方法でCRUD読み取り、曎新、削陀の䜜成の抂念を実装する必芁がある堎合、゚ンティティAPIモゞュヌルで提瀺されるより高いレベルのクラス-EntityAPIControllerからコントロヌラヌを継承するこずは理にかなっおいたす。 ただし、Entity APIの操䜜の原則を考慮するこずは、この蚘事の範囲倖であり、別の機䌚に専念したす。



All Articles