CodeFlowCodeFlowPHPアプリケーションにプラグインを許可するための最良の方法259111私はPHPで新しいWebアプリケーションを始めようとしていますが、今回はプラグインインターフェースを使って拡張できるものを作りたいと思います。'フック’を書いていくのでしょうか。Answer156Observerパターンを使うことができます。20ノート:この例のソースコードでは、拡張可能にしたい実際のソースコードの前にすべてのプラグインを宣言する必要があります。プラグインに渡される単一または複数の値を処理する方法の例を含めました。これの最も難しい部分は、どの引数が各フックに渡されるかをリストした実際のドキュメントを書くことです。これは、PHPでプラグインシステムを実現するための1つの方法です。良い代替手段があります、私はあなたが詳細についてはWordPressドキュメンテーションをチェックすることを勧めます。_申し訳ありませんが、アンダースコア文字はMarkdownによってHTMLエンティティに置き換えられているようです。このバグが修正されたら、私はこのコードを再投稿することができます。_編集:決して気にしないでください、編集しているときにだけ表示されます。source55それでは、Observerパターンは望ましくないとしましょう。リスニングのタスクを処理するようにクラスメソッドを変更する必要があり、汎用的なものが必要だからです。`extends`継承を使いたくないとしましょう。多くの労力を費やすことなく_すべてのクラスをプラガブルにするための一般的な方法があるのは素晴らしいことではないでしょうか。方法は次のとおりです。`require_once()`呼び出しに含まれるかもしれないものです。それは何かをプラガブルにするためにクラスをロードします。パート2では、ここでクラスをロードします。注クラスに特別なことをする必要はありませんでした。これは、Observerパターンとは大きく異なる点です。パート3では、ここからクラスを「プラグイン可能」に切り替えます(つまり、クラスのメソッドとプロパティをオーバーライドできるプラグインをサポートします)。したがって、たとえば、Webアプリケーションを使用している場合は、プラグインレジストリがある可能性があり、ここでプラグインをアクティブにすることができます。`Dog_bark_beforeEvent()`関数にも注目してください。'BLOCK_EVENT’を設定すると、犬が吠えるのを阻止し、またDog_bark_afterEventも阻止するでしょう。第4回では、これが通常の操作コードですが、実行すると思われるものがまったく実行されないことに注意してください。'Coco’であることを発表しません。犬は「ニャー」とは言わず、「ウーフ」と言います。あとで犬の名前を見たいときは、「ココ」ではなく「違う」とわかります。これらすべてのオーバーライドは、第3部で提供されています。eval()(みんなが「悪」だと言っている)を除外し、それがObserverパターンではないことを除外しましょう。その動作はPluggableと呼ばれる卑劣な空のクラスです。これには、Dogクラスで使用されるメソッドやプロパティは含まれていません。したがって、それが起こるので、魔法の方法は私たちのために働くでしょう。そのため、パート3と4では、Dogクラス自体ではなく、Pluggableクラスから派生したオブジェクトを使用しています。その代わりに、PluginクラスにDogオブジェクトを「触れさせる」ようにしています。)source34_hook_および_listener_メソッドが最も一般的に使用されていますが、他にもできることがあります。あなたのアプリのサイズ、そして誰があなたがコードを見ることを許可しようとしているか(これはFOSSスクリプトになるか、または社内の何かになるでしょう)に依存します。kdeloachには良い例がありますが、彼の実装とフック関数は少し危険です。私はあなたがあなたの文章のphpアプリの性質についてのより多くの情報を与えるようにあなたに頼むでしょうそしてそしてあなたはどのようにあなたはプラグインが合うのを見るか。1私からkdeloachする。source22これが私が使ったアプローチです、それはQtシグナル/スロットメカニズムから一種のオブザーバーパターンをコピーする試みです。オブジェクトは信号を出すことができます。送信者のIDオブジェクト名で構成されています。すべてのシグナルは受信側にバインドできます。これは単に「呼び出し可能」ですシグナルを受信したい人にシグナルを渡すにはバスクラスを使用します。あなたはシグナルを「送る」。以下は実装例ですログイン();?source17私は、最も簡単な方法は、Jeff自身の助言に従い、既存のコードを見直すことだと思います。Wordpress、Drupal、Joomla、その他の有名なPHPベースのCMSを見て、それらのAPIフックがどのように見えるのかを確認してください。このようにして、あなたは物事をもう少し頑固にするためにあなたが以前は考えていなかったかもしれないアイデアさえ得ることができます。"include_once"する一般的なファイルを書くことでしょう。"hooks.php"ファイルでは提供されません。それらが含まれるファイルは、ますます多くの依存関係と機能性を持つことになるからです。APIの依存関係を低く抑えるようにしてください。I.E含まれるファイルが少なくなりました。Sticklebackという素晴らしいプロジェクトがあります。あなたがhttp://www.phparch.comでそれについてカバーストーリーを読んでいるならば。source10他のプロジェクトがそれをどのようにして行ったかを調べることは良いアドバイスです。多くの人はプラグインをインストールし、それらの「名前」をサービスに登録することを要求するので(ワードプレスのように)、登録されたリスナを識別してそれらを実行する関数を呼び出すコードに「ポイント」があります。Pattern]です。これは、真のオブジェクト指向PHPシステムに実装するのに適したオプションです。Framework]は多くのフックメソッドを利用しており、非常にうまく設計されています。それは見て良いシステムでしょう。source7ここでの答えのほとんどは、Webアプリケーションにローカルなプラグイン、つまりローカルWebサーバー上で動作するプラグインを対象としているように思われることに驚きました。これを行う最善の方法は、アプリケーションで特定のイベントが発生したときに呼び出されるさまざまなURLを定義できるフォームを提供することです。発生したばかりのイベントに基づいて、さまざまなイベントがさまざまな情報を送信します。この方法では、リモートサーバーがアプリケーションから送信された情報に基づいてタスクを実行できるように、アプリケーションに提供されているURL(たとえばhttps経由)へのcURL呼び出しを実行するだけです。これには2つの利点があります。ローカルサーバーでコードをホストする必要はありません(セキュリティ)コードは、PHP以外のさまざまな言語のリモートサーバー(拡張性)に置くことができます(移植性)。