D11の時代でHOOK使ってる人っているんですかね。
今回はHOOKについての自分の理解を共有しようと思います。
HOOKって?
私は、「なにかの処理にひっかけて処理を追加する。」って理解をしています。
例えば...。
- RoutingSystemが生成されるタイミング。
- Entityが保存されるタイミング。
- Rendering配列からTemplateエンジンにデータが渡るタイミング。
いろいろ用意されています。
HOOK使いこなしてますか?
「HOOKを使って一度生成された配列を加工する。」
聞こえ悪いですよね。
生成したものを加工するのではなく、最初から望んだものを作ればいいのでは?
と、私は思います。
朝、リュックに荷物を詰めて、玄関で靴を履いて出かける一歩手前に、何を思ったのか靴を脱ぎカバンを置いて歯磨きをし始める感じ。
なんなら、リュックをまた広げて 1 から支度する。なんてことありえないですよね。
技術的に難しいからHOOKで誤魔化してるんじゃないの?それがDrupalなんじゃないの?
違います。DrupalはSymfonmyに準拠したフレームワークですのでSOLID原則で言うところのOpen-Closedの原則が綺麗に守られています。
なので、基本的にどの機能も「拡張にOpenで変更にClosed」です。
例えば、Entityが保存される時のHOOKを書くのではなく...。
EntityClassを拡張して、save
メソッドの処理を書く。
これだと複雑性を増さない設計になりますよね。
ここを、EventSubscriber等で実装してしまうと、SaveEventに対する監視が動いてしまうのでケアする箇所が多くなりますよね(メンテナンス・多機能への干渉・パフォーマンス)。
(HOOKも同様)
いちばん最悪な例
DrupalはTwigエンジンを利用しており、Rendering配列からTemplateに値を渡すタイミングに、preprocess
という概念があります。
まさか...。「一度生成し加工し終えた配列なかったことにして再生成する」なんてことはしないですよね。
歯磨き2回連続でやる人だったり、
完成した弁当箱のおかずを捨てて、買い出しからする人だったり、
見たことないです。(くどいか...)
TemplateはただのTemplate。値の加工、追加の処理は原則NGですよね。
必要なデータをLoad → 加工 → Rendering配列を生成 → Templateに渡す。
まとめ
Drupalの今後はHOOKは外れていくようです。なんかのTopicで読みました。(リンク貼れず申し訳ありません)
角が立ちそうなので今日はこの辺で。それでは。あざした。