ホームページ >バックエンド開発 >PHPチュートリアル >Drupal 8プラグインデリバティブを効果的に使用するチュートリアル
しかし、そのようなインスタンスが必要な場合は、小さなサブシステムの外部のいくつかの要因に応じて動的に宣言された場合はどうなりますか?たとえば、Drupal 7で_Infoフックを宣言する場合、
ループがどこで見られるのでしょうか?これに対する短い答えは、 私たちがやろうとしていることは、実際には非常に簡単です。サイト上のすべての記事ノードに対してブロックがある基本的なノードブロック機能を実装します。ばかげている?もちろん。サイトのすべてのノードに対してこれを行う必要がありますか?間違いなくそうではありません!しかし、これは非常に基本的な実装であり、物事を短く保ち、プラグインデリバティブの使用を実証することを目的としています。
もう少し深くするために、特定のタイプのすべてのプラグインのリストが要求されると、プラグインマネージャーはディスカバリーメカニズムを使用して、このタイプのすべてのプラグインをロードします。そのメカニズムが誘導体を誘導することで装飾されている場合、マネージャーは導関数も取得することができます。これを行うために、デリバティブディスカバリーは各プラグインでデリバークラスを探し、それを見つけた場合、このリストを尋ねます。
デリバティブクラス プラグインデリバティブの役割が何であるかがわかったので、ブロックプラグインで使用される最初のデリバクラスを作成しましょう(1分で作成します)。
最後に、getDerivativeDefinitions()は、このクラスを使用するプラグインに由来するプラグイン定義の配列を提供するメソッドです。引数として$ base_plugin_definitionを受信します(このデリバーを使用する実際のプラグインの定義)、それを使用してデリバティブ定義を構築します。私たちの場合、すべての記事ノードを無差別にロードし、それぞれについて、別のadmin_labelを持つことによってのみ異なる別の定義を作成します(これはDrupalcoreblockannotationblock Annotationクラスのプロパティです)。デリバティブの配列は、デリバティブのIDによってキー化されています(この場合、後で使用するノードID)。
ブロックプラグイン
このプラグインの注釈で最初に気付くのは、以前に作成したクラスを指すデリバーキーです。そして、それが基本的に私たちが2つを結合するために必要なすべてです。微分ディスカバリーデコレーターは、重いリフティングを処理します。 残りの多くは、私たちがよく知っているはずの基本的なブロック構築です。興味深いのは、getDerivativeID()メソッドを使用して、デリバティブのIDを表示し、それを使用してノードオブジェクトをロードし、実際のノード出力としてブロックを構築することもできることです。最後に、BlockAccess()メソッド内で、このブロックが実際のノード自体と同じアクセスチェックを持っていることを確認します。したがって、現在のユーザーが現在のノードを表示するためにアクセスできない場合、ブロックは表示されません。
この記事では、プラグインデリバティブを見て、それらがどのように機能するかの簡単な例を見ました。このトピックの重要なテイクは、プラグインデリバティブが同じプラグインの複数のインスタンスを動的に宣言する方法であるということです。通常、ユーザー構成の機能(メニューなど)をプラグイン(メニューブロックなど)に変換するのに役立ちます。
質問?コメント?さらに説明したいことはありますか?お知らせください! Drupal 8プラグインデリバティブは強力なツールですが、いくつかの課題があります。主な課題の1つは、特にDrupalが初めての開発者またはそのプラグインシステムに精通していない開発者にとって、セットアップと管理に複雑になる可能性があることです。さらに、各デリバティブは単一のベースプラグインのバリエーションであるため、ベースプラグインの変更はすべてのデリバティブに影響を与える可能性があるため、慎重な管理とテストが必要です。パーティープラグイン?
プラグインデリバティブは、特定のタイプのプラグインをそれ自体の複数のインスタンスとしてシステム内で表現できる方法です。言い換えれば、プラグインは、初期プラグイン(同じベース定義から開始)に基づいているが、わずかに異なる構成または定義データを持つプラグイン定義のリストを提供する責任のあるデリバークラスを参照できます。上記で言及したSystemMenublockは、素晴らしい例です。サイトにメニューがあるのと同じくらい多くのデリバティブを備えた単一のプラグインです。
クラスを実装する必要があるのは、DeriverInterfaceと2つの方法を実装するだけです。代わりに、deriverコンテナを認識させたいので、containerderiverInterfaceを使用します。なぜ?依存関係噴射を使用してDrupalのエンティティマネージャーをロードして、ノードストレージにアクセスできるようにしているためです(これはコンストラクターとcreate()メソッドが行うものです)。さらに、Deriverクラスは、必要な方法の1つ(getDerivativeDefinition())の1つを既に処理しているため、Deriverbaseクラスから拡張されています。 Deriverクラスができたので、それを使用してそれ自体の複数のインスタンスを生成する単純なブロックプラグインを作成しましょう(記事ノードごとに1つ)。
SRC/Plugin/block/nodeblock.php:
の内部
<?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;
}
}
結論DRUPAL 8プラグインデリバティブとは何ですか?なぜ重要なのか?これは、パフォーマンスを実行するために多数の同様のタスクがある場合に特に便利ですが、各タスクにはわずかに異なる構成が必要です。プラグインデリバティブを使用することにより、単一のベースプラグインを作成してから、必要なものとしてそのプラグインのバリエーションを生成し、それぞれ独自の構成を備えています。これにより、コードを大幅に簡素化し、Drupal 8サイトをより効率的かつ管理しやすくすることができます。 。まず、すべてのデリバティブが共有する基本的な機能を定義するベースプラグインを作成する必要があります。次に、ベースプラグインを拡張し、derivativativativationInterfaceを実装するプラグインデリバティブクラスを作成する必要があります。このクラスは、個々のデリバティブを生成する責任があります。最後に、Drupalのプラグインマネージャーとプラグインデリバティブを登録して、検出および使用できるようにする必要があります。
カスタムモジュールを備えたDrupal 8プラグインデリバティブを使用できますか?デリバティブは、カスタムモジュールで使用できます。実際、これらはこのコンテキストで特に役立ちます。単一のベースモジュールを作成し、それぞれが独自の構成を備えたそのモジュールの複数のバリエーションを生成できるからです。これにより、開発プロセスを大幅に簡素化し、カスタムモジュールをより効率的かつ管理しやすくすることができます。幅広いシナリオで使用できます。いくつかの一般的なユースケースには、それぞれが異なる構成を持つブロックプラグインの複数のインスタンスの作成が含まれます。単一のベースプラグインから複数のメニューリンクを生成します。特定のタスクまたは要件に合わせてカスタムモジュールの複数のバリエーションを作成します。ベースプラグインとそのすべてのデリバティブを追跡し、それらがすべて最新で機能していることを確認します。これは、すべてのプラグインを管理するための集中インターフェイスを提供するDrupalのプラグインマネージャーを通じて行うことができます。さらに、プラグインデリバティブを定期的に確認および更新して、サイトのユーザーのニーズとニーズを引き続き満たしていることを確認することが重要です。
Drupal 8プラグインデリバティブを使用することに制限や課題はありますか?
はい、Drupal 8プラグインデリバティブは、サードパーティのプラグインで使用できます。ただし、すべてのサードパーティプラグインがデリバティブをサポートするように設計されているわけではないため、追加の作業を行う必要がある場合があることに注意することが重要です。使用している特定のプラグインのドキュメントを常に確認して、デリバティブをサポートするかどうか、およびそれらを実装する方法を確認してください。タスクごとに実行する必要があるコードの量を減らすことにより、サイトのパフォーマンスを改善できます。単一のベースプラグインを作成してから、複数のデリバティブを生成することにより、各タスクの個別のコードを書き込み、実行する必要がないようにします。これにより、特に多数の同様のタスクがあるサイトでは、大幅なパフォーマンスが向上する可能性があります。彼らの動的な性質のために挑戦的になる可能性があります。ただし、Drupalはこれを支援するためのいくつかのツールとテクニックを提供しています。最も有用なものの1つは、デバッグおよび開発ツールの範囲を提供するDevelモジュールです。さらに、Drupalのエラーロギングおよびレポート機能は、発生する問題に関する貴重な情報を提供できます。 Drupal 8プラグインデリバティブの詳細を学ぶため。プラグインデリバティブを含むDrupal開発のあらゆる側面に関する包括的な情報を提供するため、公式のDrupalドキュメントは開始するのに最適な場所です。さらに、このトピックを詳細にカバーする多くのチュートリアル、ブログ投稿、フォーラムディスカッションがあります。
以上がDrupal 8プラグインデリバティブを効果的に使用するチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。