PHP:コンテキストのパラメーター

問題:

相互作用するいくつかのオブジェクトが特定のメソッドのロジックを制御できることが必要です。

たとえば、各オブジェクトにはData()メソッドがあり、ページにオブジェクトを表示するために必要なデータ(テンプレートエンジンのデータ)を返します。 たとえば、Newsクラスの$ newsオブジェクトは、5つの最新ニュースを、たとえば配列としてテンプレートエンジンで受け入れ可能な形式で返す必要があります。 News :: Data()は、特定のニュース項目(見出し、日付など)に関連するデータを取得するために、オブジェクト$ newsPost-> Data()(添付オブジェクトに)を順番に使用します。 ただし、場合によっては、NewsPose :: Data()は完全なデータではなく、見出し(たとえば、サイトのメインページ)のみを返す必要があり、別の場合は、「関連ニュース」へのリンクを含むすべてのデータを返す必要があります。

いくつかのData()メソッド(DataShort()、DataFull())を使用すると問題は解決しますが、よりエレガントなソリューションが欲しいです。

制御スクリプト(たとえば、ページコンストラクター)は、NewsPost :: Data()がどの形式でデータを返すかを「認識」しますが、NewsPostクラスのオブジェクトと直接対話することはできません。これはNewsクラスの「懸念」です。 したがって、スクリプトでできることは、「短縮」データを返すために「ニュース」「ニュース」「ニュース」「ニュース」です。

Copy Source | Copy HTML $ data = $news-> Data ( 'ask newsPost: return short data' );
  1. Copy Source | Copy HTML $ data = $news-> Data ( 'ask newsPost: return short data' );


次に、News :: Data()の中に何かがあります:

Copy Source | Copy HTML
  1. パブリック関数データ( $ askWhat
  2. {
  3. ...
  4. $ dataNews = $ this- > newsPost-> Data( 'return short data' );
  5. ...
  6. }


おそらくNewsPost :: Data()は、実際の記事を取得するためにNewsPostBody :: Data()などのいくつかのオブジェクトも呼び出します。 次に、NewsPost :: Data()の「ショートデータ」リクエストを受信したら、NewsPostBody :: Data()メソッドに「body short」パラメータを指定してリクエストを行う必要があります。 「制御スクリプト」がこれについて知る必要はありませんが、記事の「ショートバージョン」を返すようにNewsPostBodyクラスオブジェクトに直接「指示」する機能をブロックすることはできません。 つまり、次のようなものです。

Copy Source | Copy HTML
  1. $ data = $ news-> Data'NewsPostBody:短い記事を返す' );


ただし、1つの要求で、異なるパラメーターを使用してNewsPostBody :: Data()メソッドにアクセスする必要がある場合があります。 たとえば、ニュースに「サイトニュース」が含まれる場合、NewsPostBody :: Data()は常に「割礼されていない」バージョンを返す必要があります。 つまり、次のようなものです。

Copy Source | Copy HTML
  1. $ data = $ news-> Data'NewsPostBody(メインニュースのみ):短い記事を返す' );


または:

Copy Source | Copy HTML
  1. $ data = $ news-> Data'メインニュースショートボディを返す' );


ただし、News :: Data()は次のようになります。

画像

または、「Return SEO friendly body」など、他のパラメーターがSiteNewsBody :: Data()に渡される場合はさらに複雑になります。

いくつかの技術的要件が迫っています。



コンテキスト::クラス::コマンド

クラスは原則として特定のコンテキストコンテキストにもあるため、「ネストコンテキスト」を使用できます。

ContextInContextInContex ::コマンド

また、コマンド制御コンポーネントの拡張された使用について考え、引数を「コマンド」自体から分離する可能性を提供する必要があります。たとえば、「body_short = 250」は「記事を250文字に制限する」ことを意味します。 私たちが持っています:

ContextInContext ::コマンド[=引数(s)];

Copy Source | Copy HTML
  1. $ data = $ news-> Datanew Parameters'NewsBodyInMainNews:short = 250; NewsBodyInSiteNews:seo_frendly; short = 500; NewsBody:keepHtml' ));


インターフェースの「ライブ」をスケッチしてみましょう。

Copy Source | Copy HTML
  1. 関数 News ::データ( $ params
  2. {
  3. $ newsData = new NewsData();
  4. // 'SiteNews'のコンテキストでパラメータを使用して必要なデータを追加します
  5. //パラメータshort = 500およびseo_freindlyおよびkeepHtmlを使用する必要があります
  6. $ params-> useContext( 'SiteNews' );
  7. $ newsData- > add( $ this-> getSiteNewsData( $ params ));
  8. $ params-> dontUseContext( 'SiteNews' );
  9. // 'MainNews'のコンテキストでパラメータを使用して必要なデータを追加します
  10. // short = 250のみで、keepHtmlパラメータを使用する必要があります
  11. $ params-> useContext( 'MainNews' );
  12. $ newsData- > add( $ this-> getMainNewsData( $ params ));
  13. $ params-> dontUseContext( 'MainNews' );
  14. return $ newsData ;
  15. }
  16. ...
  17. 関数 NewsBody ::データ( $ params
  18. {
  19. $ newsBodyData = new NewsBodyData();
  20. $ params-> useContext( 'NewsBody' );
  21. $ bodyLimit = $ params- > get( 'short' );
  22. $ newsBodyData- > add( 'body'$ this-> getBody( $ bodyLimit ));
  23. $ params-> dontUseContext( 'NewsBody' );
  24. ...
  25. $ newsBodyDataを返します。
  26. }


ほとんどすべてがクラスの開発を開始する準備ができています。 将来のクラスの主なポイントを要約して強調するには:



画像

実装を開始できます。

PS。 トピックはかつて私によって公開されました。 それ以来、私はこのパターンを新しい「自転車」であるかどうかを考えずに使用しています。 たぶん誰かが役に立つでしょう。 具体的に議論させていただきます。

Source: https://habr.com/ru/post/J54692/


All Articles