ホームページ > バックエンド開発 > PHPチュートリアル > あなた自身のカスタムアノテーション - 単なるコメント以上のもの!

あなた自身のカスタムアノテーション - 単なるコメント以上のもの!

Christopher Nolan
リリース: 2025-02-15 09:22:12
オリジナル
873 人が閲覧しました

PHPカスタムアノテーション:強化されたコードの柔軟性とスケーラビリティ

この記事では、Symfony 3アプリケーションでカスタムアノテーションを作成および使用する方法について説明します。注釈は、上記のクラス、方法、およびプロパティを宣言するためによく使用されるドキュメントブロックメタデータ/構成です。メソッドへのアクセス。この記事では、クラスをロードせずに注釈をカスタマイズし、クラスまたはメソッド情報を読み取る方法について説明します。 @Route() @ORM()

キーポイント:

PHPカスタムアノテーションを使用してメタデータをコードに追加し、コードの動作に影響を及ぼし、より柔軟で適応しやすくします。それらを使用して、ルーティング情報を定義したり、検証ルールを指定したり、依存関係の噴射を構成したりできます。
  • PHPカスタムアノテーションの作成には、アノテーションを表すために新しいクラスを定義する必要があります。このクラスには、注釈で設定する値に対応するプロパティが必要です。
  • ドクトリンはカスタムアノテーションをサポートしています。独自の注釈を定義し、ドクトリンエンティティで使用できます。 Doctrineの注釈読者はこれらの注釈を解析し、それらを使用してエンティティの行動に影響を与えることができます。
  • PHPカスタムアノテーションを使用することの制限の1つは、言語自体によってネイティブにサポートされていないことです。これは、教義やPHP-DIなどの注釈サポートを提供するライブラリまたはツールを使用する必要があることを意味します。
  • PHP Custom Annotationsには、Webアプリケーションのルーティング情報の定義、フォーム入力の検証ルールの指定、依存関係インジェクションの構成など、さまざまな用途があります。また、コードにドキュメントを追加するためにも使用できます。

Your Own Custom Annotations - More than Just Comments!

免責事項:

注釈は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();
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
一意の名前(文字列)とワーカー速度(積分)の2つのプロパティのみで、シンプルに保ちます。 Doctrineの注釈図書館がこの注釈を認識するには、一致するクラスを作成する必要があります。これには、それ自体がいくつかの注釈があります。

このクラスをバンドルネームスペースの注釈フォルダーに入れ、単にワーカーと命名しました:

/**
 * @Worker(
 *     name = "唯一的Worker名称",
 *     speed = 10
 * )
 */
ログイン後にコピー
ログイン後にコピー
ご覧のとおり、2つのプロパティといくつかの単純なゲッターメソッドがあります。さらに重要なことに、上部に2つの注釈があります。

(注釈を表すようにそのようなクラスを教えることを伝えます)と@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と同じ名前空間で、このシンプルなマネージャークラスを使用できます。

discoverer
use WorkerBundle\Annotation\Worker;
ログイン後にコピー

注釈デモの重要な部分は、実際には発見プロセスの一部です。なぜ?労働者の注釈を使用して、対応するクラスを労働者として扱うべきかどうかを判断するためです。このプロセスでは、実際にオブジェクトをインスタンス化する前にメタデータを使用します。 workerdiscoveryクラスをご覧ください:

connect
<?php
namespace WorkerBundle\Workers;

class WorkerManager
{
    // ... (代码与原文相同) ...
}
ログイン後にコピー

メインコンポーネントができたので、すべてを接続する時が来ました。まず、サービス定義が必要なので、バンドルのリソース/構成フォルダーで、このservices.ymlファイルを使用できます。

サービス定義をコンテナで中央にピックアップするためには、小さな拡張クラスを作成する必要があります。したがって、バンドルの依存指示フォルダーで、WorkerExtensionというクラスを作成します。 Symfonyが自動的に拾うためには、場所と名前が重要です。

<?php
namespace WorkerBundle\Workers;

// ... (代码与原文相同) ...
}
ログイン後にコピー
最後に、バンドルを登録する必要があります。 Appkernel:

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;
    }
}
ログイン後にコピー
ログイン後にコピー

結論

アノテーションを使用して、クラス(または方法とプロパティ)に関するメタデータを表現できるようになりました。このチュートリアルでは、アプリケーション(またはその他の外部バンドル)を可能にする小さなパッケージを構築して、それらについていくつかのメタデータを定義することでいくつかの作業を実行できる労働者を宣言します。このメタデータは、それらを簡単に発見できるだけでなく、実際に使用すべきかどうかに関する情報も提供します。

Your Own Custom Annotations - More than Just Comments! プロジェクトでカスタムアノテーションを使用していますか?もしそうなら、どのようにそれらを実装しましたか?たぶん3番目の方法がありますか?教えてください!


(Symfony、Doctrine、Annotations、さまざまなエンタープライズレベルのPHPコンテンツについて詳しく学ぶことに興味がありますか?あなたが持ってきたい人の!

(元のテキストのFAQ部分は省略されています。コンテンツが翻訳されたコンテンツと書き直されたコンテンツと高度に複製されているためです。)

以上があなた自身のカスタムアノテーション - 単なるコメント以上のもの!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート