この記事では、Symfony 3アプリケーションでカスタムアノテーションを作成および使用する方法について説明します。注釈は、上記のクラス、方法、およびプロパティを宣言するためによく使用されるドキュメントブロックメタデータ/構成です。メソッドへのアクセス。この記事では、クラスをロードせずに注釈をカスタマイズし、クラスまたはメソッド情報を読み取る方法について説明します。 @Route()
@ORM()
PHPカスタムアノテーションを使用してメタデータをコードに追加し、コードの動作に影響を及ぼし、より柔軟で適応しやすくします。それらを使用して、ルーティング情報を定義したり、検証ルールを指定したり、依存関係の噴射を構成したりできます。
注釈はSymfonyとは関係ありません。これは、ClassメソッドにORM情報をマッピングする問題を解決するためのDoctrineプロジェクトの一部として開発された概念です。 この記事は、WorkerBundleと呼ばれる小さな再利用可能なバンドルを構築します(デモンストレーションのみ、実際にはパッケージ化できません)。さまざまな速度で「実行」するさまざまなワーカータイプを定義できる小さな概念を開発します。これは、アプリケーションの誰でも使用できます。実際の労働者の運用は、この記事の範囲を超えています。これは、それらを管理するシステムのセットアップに関心がある(そして注釈を通してそれらを発見する)からです。
このリポジトリを表示して、記載されているように、ローカルSymfonyアプリケーションでバンドルをセットアップできます。
ワーカーは、メソッドを必要とするインターフェイスを実装します:。新しいWorkerBundleでは、ディレクトリを作成して、それをきれいに保ち、インターフェイスを追加しましょう。
::work()
アノテーションWorkers/
<?php namespace WorkerBundle\Workers; interface WorkerInterface { /** * 执行工作 * * @return NULL */ public function work(); }
Doctrineマップは、注釈自体の内部のキーを表すプロパティを表すクラスへの注釈をブロックします。独自の注釈を作成して、それをしましょう。
各workerInterfaceインスタンスには、ドキュメントブロックに次の注釈があります。
<?php namespace WorkerBundle\Workers; interface WorkerInterface { /** * 执行工作 * * @return NULL */ public function work(); }
このクラスをバンドルネームスペースの注釈フォルダーに入れ、単にワーカーと命名しました:
/** * @Worker( * name = "唯一的Worker名称", * speed = 10 * ) */
(注釈を表すようにそのようなクラスを教えることを伝えます)と@Annotation
(メソッドやプロパティの上ではなく、クラス全体の上に使用する必要があることを伝えます)。それだけです。WorkerInterfaceクラスは、ファイルの上部にある@Target("CLASS")
ステートメントを使用して対応するクラスがインポートされるようにすることで、この注釈を使用できるようになりました。
use
<?php namespace WorkerBundle\Annotation; use Doctrine\Common\Annotations\Annotation; /** * @Annotation * @Target("CLASS") */ class Worker { /** * @Required * * @var string */ public $name; /** * @Required * * @var int */ public $speed; /** * @return string */ public function getName() { return $this->name; } /** * @return int */ public function getSpeed() { return $this->speed; } }
次に、利用可能なすべての労働者のリストを取得して作成できるマネージャーが必要です。 WorkerInterfaceと同じ名前空間で、このシンプルなマネージャークラスを使用できます。
discovereruse WorkerBundle\Annotation\Worker;
注釈デモの重要な部分は、実際には発見プロセスの一部です。なぜ?労働者の注釈を使用して、対応するクラスを労働者として扱うべきかどうかを判断するためです。このプロセスでは、実際にオブジェクトをインスタンス化する前にメタデータを使用します。 workerdiscoveryクラスをご覧ください:
connect<?php namespace WorkerBundle\Workers; class WorkerManager { // ... (代码与原文相同) ... }
メインコンポーネントができたので、すべてを接続する時が来ました。まず、サービス定義が必要なので、バンドルのリソース/構成フォルダーで、このservices.ymlファイルを使用できます。
サービス定義をコンテナで中央にピックアップするためには、小さな拡張クラスを作成する必要があります。したがって、バンドルの依存指示フォルダーで、WorkerExtensionというクラスを作成します。 Symfonyが自動的に拾うためには、場所と名前が重要です。
<?php namespace WorkerBundle\Workers; // ... (代码与原文相同) ... }
services: worker_manager: class: WorkerBundle\Workers\WorkerManager arguments: ["@worker_discovery"] worker_discovery: class: WorkerBundle\Workers\WorkerDiscovery arguments: ["%worker_namespace%", "%worker_directory%", "%kernel.root_dir%", "@annotation_reader"]
<?php namespace WorkerBundle\DependencyInjection; // ... (代码与原文相同) ... }
今、私たちは働く準備ができています。中央のパラメーターのワーカーがどこにあるかを構成しましょう。 これらのパラメーターは、上記のように、コンテナからWorkerdiscoveryクラスに渡されます。
場所はあなた次第ですが、今度はアプリのメインAppBundleバンドルにワーカーを入れましょう。私たちの最初の労働者は次のようになるかもしれません:
<?php namespace WorkerBundle\Workers; interface WorkerInterface { /** * 执行工作 * * @return NULL */ public function work(); }
私たちの注釈があります、use
ステートメントが整っているので、何らかのビジネスロジックがそれを見つけてインスタンス化することを妨げることはできません。コントローラー方法内の内部:
/** * @Worker( * name = "唯一的Worker名称", * speed = 10 * ) */
または
<?php namespace WorkerBundle\Annotation; use Doctrine\Common\Annotations\Annotation; /** * @Annotation * @Target("CLASS") */ class Worker { /** * @Required * * @var string */ public $name; /** * @Required * * @var int */ public $speed; /** * @return string */ public function getName() { return $this->name; } /** * @return int */ public function getSpeed() { return $this->speed; } }
結論
アノテーションを使用して、クラス(または方法とプロパティ)に関するメタデータを表現できるようになりました。このチュートリアルでは、アプリケーション(またはその他の外部バンドル)を可能にする小さなパッケージを構築して、それらについていくつかのメタデータを定義することでいくつかの作業を実行できる労働者を宣言します。このメタデータは、それらを簡単に発見できるだけでなく、実際に使用すべきかどうかに関する情報も提供します。
プロジェクトでカスタムアノテーションを使用していますか?もしそうなら、どのようにそれらを実装しましたか?たぶん3番目の方法がありますか?教えてください!
(元のテキストのFAQ部分は省略されています。コンテンツが翻訳されたコンテンツと書き直されたコンテンツと高度に複製されているためです。)
以上があなた自身のカスタムアノテーション - 単なるコメント以上のもの!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。