検索
ホームページバックエンド開発PHPチュートリアルDrupal 8プラグインデリバティブを効果的に使用するチュートリアル

Drupal 8プラグインデリバティブを効果的に使用するチュートリアル

キーテイクアウト

    Drupal 8のプラグインデリバティブは、同じプラグインの複数のインスタンスの動的宣言を可能にし、ユーザーが構成した機能をプラグインに変換します。
  • Deriverクラスは、初期プラグインに基づいているが、構成または定義データがわずかに異なるプラグイン定義のリストを提供するために使用されます。
  • プラグインマネージャーの派生Iscoverydecoratorは、各プラグインでデリバなクラスを探し、リストを要求するためにデリバティブを取得するために使用されます。
  • プラグインデリバティブは強力なツールですが、特にDrupalを初めて使用したり、プラグインシステムに不慣れな開発者にとっては、セットアップと管理に複雑になります。ベースプラグインの変更がすべての導関数に影響を与える可能性があるため、慎重な管理とテストが必要です。
  • 以前のチュートリアルでは、Drupal 8プラグインシステムと、独自のカスタムプラグインタイプを作成する方法を調べました。 Drupal 7の_Infoフックを介して宣言された機能の多くがこれらのプラグインに置き換えられていることがわかりました。私たちのユースケースは非常に基本的であり、そのような機能の各
  • インスタンスを新しいプラグインクラスと関連フォームを介して手動で宣言することができました。

しかし、そのようなインスタンスが必要な場合は、小さなサブシステムの外部のいくつかの要因に応じて動的に宣言された場合はどうなりますか?たとえば、Drupal 7で_Infoフックを宣言する場合、何かの返された配列に新しいアイテムを宣言できます。メニューシステムは、Drupal Coreが付属するか、後でUIを介して作成される各メニューに新しいブロックを提供するためにこれを行います。

では、Drupal 8はどうですか?特定のタイプのプラグインごとに、別のPHPクラスを宣言する必要があることがわかりました。新しいブロックを作成するには、新しいクラスが必要です。別のブロックを作成するには、別のクラスが必要です。では、Drupal 7では、

ループがどこで見られるのでしょうか?これに対する短い答えは、。 この記事では、それに対する長い答えを探り、派生物とは何か、どのように使用できるかを学びます。後者については、このGITリポジトリにあるデモモジュール内に例を作成し、何が起こっているのかをよりよく理解するのに役立つはずです。少し複雑な例として、メニューシステムは、それぞれのメニューに個別のブロックを提供するため、優れています(Drupal 7に似ていますが、プラグインを使用)。

私たちがやろうとしていることは、実際には非常に簡単です。サイト上のすべての記事ノードに対してブロックがある基本的なノードブロック機能を実装します。ばかげている?もちろん。サイトのすべてのノードに対してこれを行う必要がありますか?間違いなくそうではありません!しかし、これは非常に基本的な実装であり、物事を短く保ち、プラグインデリバティブの使用を実証することを目的としています。

プラグインデリバティブ

プラグインデリバティブは、特定のタイプのプラグインをそれ自体の複数のインスタンスとしてシステム内で表現できる方法です。言い換えれば、プラグインは、初期プラグイン(同じベース定義から開始)に基づいているが、わずかに異なる構成または定義データを持つプラグイン定義のリストを提供する責任のあるデリバークラスを参照できます。上記で言及したSystemMenublockは、素晴らしい例です。サイトにメニューがあるのと同じくらい多くのデリバティブを備えた単一のプラグインです。

もう少し深くするために、特定のタイプのすべてのプラグインのリストが要求されると、プラグインマネージャーはディスカバリーメカニズムを使用して、このタイプのすべてのプラグインをロードします。そのメカニズムが誘導体を誘導することで装飾されている場合、マネージャーは導関数も取得することができます。これを行うために、デリバティブディスカバリーは各プラグインでデリバークラスを探し、それを見つけた場合、このリストを尋ねます。

DefaultPluginManagerベースクラスを拡張するプラグインタイプマネージャーには、通常、デフォルトの発見(アノテーション)を飾るデリバティブディスカバリーメカニズムが必要です。これは、Drupal Coreプラグインシステムで最も一般的なパターンです。デリバティブによってラップされた注釈付きディスカバリー。

デリバティブクラス

プラグインデリバティブの役割が何であるかがわかったので、ブロックプラグインで使用される最初のデリバクラスを作成しましょう(1分で作成します)。

src/plugin/derivative/nodeblock.phpの内部デモモジュール次は次のとおりです。

クラスを実装する必要があるのは、DeriverInterfaceと2つの方法を実装するだけです。代わりに、deriverコンテナを認識させたいので、containerderiverInterfaceを使用します。なぜ?依存関係噴射を使用してDrupalのエンティティマネージャーをロードして、ノードストレージにアクセスできるようにしているためです(これはコンストラクターとcreate()メソッドが行うものです)。さらに、Deriverクラスは、必要な方法の1つ(getDerivativeDefinition())の1つを既に処理しているため、Deriverbaseクラスから拡張されています。

最後に、getDerivativeDefinitions()は、このクラスを使用するプラグインに由来するプラグイン定義の配列を提供するメソッドです。引数として$ base_plugin_definitionを受信します(このデリバーを使用する実際のプラグインの定義)、それを使用してデリバティブ定義を構築します。私たちの場合、すべての記事ノードを無差別にロードし、それぞれについて、別のadmin_labelを持つことによってのみ異なる別の定義を作成します(これはDrupalcoreblockannotationblock Annotationクラスのプロパティです)。デリバティブの配列は、デリバティブのIDによってキー化されています(この場合、後で使用するノードID)。

ここで行う必要がある非常に重要なポイントは、すべてのノードをロードしてそれらからプラグインを作成することは決して良い考えではないことです。多分興味深いのは、チェックボックスなどを介して個々のノードをブロックとして公開できる機能を実装することです。

ブロックプラグイン

Deriverクラスができたので、それを使用してそれ自体の複数のインスタンスを生成する単純なブロックプラグインを作成しましょう(記事ノードごとに1つ)。 SRC/Plugin/block/nodeblock.php:

の内部

このプラグインの注釈で最初に気付くのは、以前に作成したクラスを指すデリバーキーです。そして、それが基本的に私たちが2つを結合するために必要なすべてです。微分ディスカバリーデコレーターは、重いリフティングを処理します。

残りの多くは、私たちがよく知っているはずの基本的なブロック構築です。興味深いのは、getDerivativeID()メソッドを使用して、デリバティブのIDを表示し、それを使用してノードオブジェクトをロードし、実際のノード出力としてブロックを構築することもできることです。最後に、BlockAccess()メソッド内で、このブロックが実際のノード自体と同じアクセスチェックを持っていることを確認します。したがって、現在のユーザーが現在のノードを表示するためにアクセスできない場合、ブロックは表示されません。

キャッシュをクリアしてブロックレイアウトインターフェイスに移動すると、ノードブロックと呼ばれるいくつかのブロックが表示されるはずです。[ノードタイトル]。これらを必要な場所に配置すると、関連するノードがレンダリングされます。
<?php /**
 * @file
 * Contains \Drupal\demo\Plugin\Derivative\NodeBlock.
 */

namespace Drupal\demo\Plugin\Derivative;

use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides block plugin definitions for nodes.
 *
 * @see \Drupal\demo\Plugin\Block\NodeBlock
 */
class NodeBlock extends DeriverBase implements ContainerDeriverInterface {

  /**
   * The node storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $nodeStorage;

  /**
   * Constructs new NodeBlock.
   *
   * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
   *   The node storage.
   */
  public function __construct(EntityStorageInterface $node_storage) {
    $this->nodeStorage = $node_storage;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, $base_plugin_id) {
    return new static(
      $container->get('entity.manager')->getStorage('node')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getDerivativeDefinitions($base_plugin_definition) {
    $nodes = $this->nodeStorage->loadByProperties(['type' => 'article']);
    foreach ($nodes as $node) {
      $this->derivatives[$node->id()] = $base_plugin_definition;
      $this->derivatives[$node->id()]['admin_label'] = t('Node block: ') . $node->label();
    }
    return $this->derivatives;
  }
}
結論

この記事では、プラグインデリバティブを見て、それらがどのように機能するかの簡単な例を見ました。このトピックの重要なテイクは、プラグインデリバティブが同じプラグインの複数のインスタンスを動的に宣言する方法であるということです。通常、ユーザー構成の機能(メニューなど)をプラグイン(メニューブロックなど)に変換するのに役立ちます。

デリバティブの使用を説明するために、記事ノードをブロックとしてレンダリングできる非常にシンプルな手法を見てきました。ただし、多くの記事ノードを備えたWebサイトでこれを試していないことを覚えておく必要があります。むしろ、公開されるノードの数を制限する追加の機能を実装する必要があります。ご存知のように、私たちはサイトをクラッシュさせません。

質問?コメント?さらに説明したいことはありますか?お知らせください!

Drupal 8プラグインデリバティブを効果的に使用することに関するよくある質問(FAQ)

DRUPAL 8プラグインデリバティブとは何ですか?なぜ重要なのか?これは、パフォーマンスを実行するために多数の同様のタスクがある場合に特に便利ですが、各タスクにはわずかに異なる構成が必要です。プラグインデリバティブを使用することにより、単一のベースプラグインを作成してから、必要なものとしてそのプラグインのバリエーションを生成し、それぞれ独自の構成を備えています。これにより、コードを大幅に簡素化し、Drupal 8サイトをより効率的かつ管理しやすくすることができます。 。まず、すべてのデリバティブが共有する基本的な機能を定義するベースプラグインを作成する必要があります。次に、ベースプラグインを拡張し、derivativativativationInterfaceを実装するプラグインデリバティブクラスを作成する必要があります。このクラスは、個々のデリバティブを生成する責任があります。最後に、Drupalのプラグインマネージャーとプラグインデリバティブを登録して、検出および使用できるようにする必要があります。

カスタムモジュールを備えたDrupal 8プラグインデリバティブを使用できますか?デリバティブは、カスタムモジュールで使用できます。実際、これらはこのコンテキストで特に役立ちます。単一のベースモジュールを作成し、それぞれが独自の構成を備えたそのモジュールの複数のバリエーションを生成できるからです。これにより、開発プロセスを大幅に簡素化し、カスタムモジュールをより効率的かつ管理しやすくすることができます。幅広いシナリオで使用できます。いくつかの一般的なユースケースには、それぞれが異なる構成を持つブロックプラグインの複数のインスタンスの作成が含まれます。単一のベースプラグインから複数のメニューリンクを生成します。特定のタスクまたは要件に合わせてカスタムモジュールの複数のバリエーションを作成します。ベースプラグインとそのすべてのデリバティブを追跡し、それらがすべて最新で機能していることを確認します。これは、すべてのプラグインを管理するための集中インターフェイスを提供するDrupalのプラグインマネージャーを通じて行うことができます。さらに、プラグインデリバティブを定期的に確認および更新して、サイトのユーザーのニーズとニーズを引き続き満たしていることを確認することが重要です。

Drupal 8プラグインデリバティブを使用することに制限や課題はありますか?

Drupal 8プラグインデリバティブは強力なツールですが、いくつかの課題があります。主な課題の1つは、特にDrupalが初めての開発者またはそのプラグインシステムに精通していない開発者にとって、セットアップと管理に複雑になる可能性があることです。さらに、各デリバティブは単一のベースプラグインのバリエーションであるため、ベースプラグインの変更はすべてのデリバティブに影響を与える可能性があるため、慎重な管理とテストが必要です。パーティープラグイン?

​​

はい、Drupal 8プラグインデリバティブは、サードパーティのプラグインで使用できます。ただし、すべてのサードパーティプラグインがデリバティブをサポートするように設計されているわけではないため、追加の作業を行う必要がある場合があることに注意することが重要です。使用している特定のプラグインのドキュメントを常に確認して、デリバティブをサポートするかどうか、およびそれらを実装する方法を確認してください。タスクごとに実行する必要があるコードの量を減らすことにより、サイトのパフォーマンスを改善できます。単一のベースプラグインを作成してから、複数のデリバティブを生成することにより、各タスクの個別のコードを書き込み、実行する必要がないようにします。これにより、特に多数の同様のタスクがあるサイトでは、大幅なパフォーマンスが向上する可能性があります。彼らの動的な性質のために挑戦的になる可能性があります。ただし、Drupalはこれを支援するためのいくつかのツールとテクニックを提供しています。最も有用なものの1つは、デバッグおよび開発ツールの範囲を提供するDevelモジュールです。さらに、Drupalのエラーロギングおよびレポート機能は、発生する問題に関する貴重な情報を提供できます。 Drupal 8プラグインデリバティブの詳細を学ぶため。プラグインデリバティブを含むDrupal開発のあらゆる側面に関する包括的な情報を提供するため、公式のDrupalドキュメントは開始するのに最適な場所です。さらに、このトピックを詳細にカバーする多くのチュートリアル、ブログ投稿、フォーラムディスカッションがあります。

以上がDrupal 8プラグインデリバティブを効果的に使用するチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター