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

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

Christopher Nolan
Christopher Nolanオリジナル
2025-02-16 11:26:121001ブラウズ

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 までご連絡ください。