PHPでのCompositeパターンの実装

はじめに



サーバープログラミングの研究のある段階で、私は自分自身のシンプルなフレームワークを書きたかった。 これは、特にMVCとZend Frameworkのイデオロギーをよりよく理解するのに役立つと期待していました。 htmlプレゼンテーションと生成の部分に関しては、 Composite patternを思い出しました。 おそらく私はその応用をいくらか歪めましたが、考えはそこから行きました。



ポイントまで



すべてのページはオブジェクトで構成され、オブジェクトはオブジェクトで構成することもできます。 この種のネストは、再帰的なHTMLコード生成のアイデアを示唆しています。 また、アプリケーションロジックの実行中にいつでもページの任意の部分のコンテンツを補完し、すべてのhtmlコードを一度に生成できるようにしたいと考えています。



ビジネスへ



任意のオブジェクトに別のオブジェクトなどを含めることができます。 各オブジェクトには、オブジェクトのhtmlコードを表示し、すべての子オブジェクトに対してdraw()メソッドを呼び出すdraw()メソッドがあります。 オブジェクトにはさまざまなタイプがあります(例:記事、リスト、投稿、フォトアルバム、最後のヘッダー)。 もちろん、オブジェクトのタイプごとにdraw()メソッドの実装は異なります。 上記のコードを表現したいと思います。



abstract class AbstractView { public $fillings; abstract public function draw(); protected function insert($filling_name){ if(isset($this->fillings[$filling_name])){ $this->fillings[$filling_name]->draw(); } } }
      
      





insert()メソッドは、子オブジェクトのdraw()メソッドが呼び出されるメソッドです。 すべての子オブジェクトは、$充填の連想配列に含まれています。 多くの場合、htmlコードを生成するのではなく、単にテキストまたは数字を書き込む必要があります。 もちろん、そのような目的のために、Viewオブジェクトを継承することができます。このオブジェクトのdraw()メソッドは、たとえば、コンストラクターまたは追加のプロパティで指定された必要な値を単に表示します。 しかし、これは非常に不便であり、ページを形成するプロセスを複雑にします。 したがって、このような値とその出力用のメソッドを格納するための2番目の連想配列を作成します。



 abstract class AbstractView { public $fillings; public $values; abstract public function draw(); protected function insert($filling_name){ if(isset($this->fillings[$filling_name])){ $this->fillings[$filling_name]->draw(); } } protected function write($value_name){ if(isset($this->values[$value_name])){ echo $this->values[$value_name]; } } }
      
      





次に、デモンストレーション用の2つの単純な相続人を作成します。 1つは帽子を表し、2つ目は挨拶を表します。



 class LayoutView extends AbstractView { public function draw(){ include '/layout.phtml'; } } class IndexView extends AbstractView{ public function draw(){ include '/index.phtml'; } }
      
      





layout.phtmlおよびindex.phtmlファイルとは何ですか?

layout.phtml:

 <!DOCTYPE html> <html> <head> <title><?php $this->write('title')?></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <?php $this->insert('content'); ?> </body> </html>
      
      





index.phtml:

 <div>Hello, Habrahabr!</div>
      
      





すべてを接続してページを生成します。



 $page = new LayoutView(); $page->values['title'] = "greating"; $page->fillings['content'] = new IndexView(); $page->draw();
      
      





結果:



 <!DOCTYPE html> <html> <head> <title>greating</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <div>Hello, Habrahabr!</div> </body> </html>
      
      





現時点では、このような実装は私にとって便利なように思えますが、近い将来、考えが変わる可能性があります。



ヴォルテールが言ったように:

「私はあなたの意見に同意しないかもしれませんが、あなたがそれを表現する権利のために私の人生を与える用意ができています。」



PS:VariableViewクラスのsdevalexコメントと、一般的なセキュリティのarturgspbに注意してください。



All Articles