首頁 > 後端開發 > php教程 > 有效使用Drupal 8插件衍生物的教程

有效使用Drupal 8插件衍生物的教程

Christopher Nolan
發布: 2025-02-16 11:26:12
原創
987 人瀏覽過

有效使用Drupal 8插件衍生物的教程

鑰匙要點

    Drupal 8中的
  • 插件衍生物允許同一插件的多個實例的動態聲明,將用戶配置的功能轉換為插件。
  • > deriver類用於提供基於初始插件但具有略有不同配置或定義數據的插件定義的列表。
  • >
  • >插件管理器中的派生式coveryDecorator用於檢索衍生詞,在每個插件上尋找派生類並詢問列表。
  • >
  • >插件導數是一種功能強大的工具,但它們可以設置和管理很複雜,尤其是對於新手Drupal或不熟悉其插件系統的開發人員。需要仔細的管理和測試,因為對基本插件的更改可能會影響其所有導數。
  • 在較早的教程中,我們查看了Drupal 8插件系統以及如何創建自己的自定義插件類型。我們已經看到,Drupal 7中通過_info鉤聲聲明的許多功能已被這些插件替換。我們的用例非常基本,並且可以通過新的插件類和關聯的表單手動聲明此類功能的每個
  • 實例

>但是,如果我們需要這樣的

實例有效使用Drupal 8插件衍生物的教程>動態聲明,具體取決於我們小子系統外部的某些因素?例如,當在Drupal 7中聲明_info鉤子時,我們可以獲得

的列表,循環循環並在返回的數組中為每個單獨的> something 聲明一個新項目。菜單系統這樣做是為了為每個菜單提供一個新塊,該菜單帶有Drupal Core,或者以後通過UI創建。 > Drupal 8呢?我們已經看到,對於某種類型的每個插件,我們需要聲明其他PHP類。要創建一個新的塊,我們需要一個新類。要創建另一個塊,我們需要另一個類。那麼,我們在Drupal 7中看到的循環在哪裡?對此的簡短答案是:在>插件中 在本文中,我們將探索對此的長期答案,並了解派生是什麼以及如何使用它們。對於後者,我們將在演示模塊中構建一個示例,該示例可以在此GIT存儲庫中找到,並希望它可以幫助我們更好地了解發生了什麼。對於一個稍微複雜的示例,菜單系統非常好,因為它為其每個菜單提供了一個單獨的塊(類似於Drupal 7,但使用插件)。

>

我們要做的實際上非常簡單。我們將實現基本節點塊功​​能,通過該功能,對於我們網站上的所有文章節點,我們都將擁有一個塊。荒謬的?當然。我們應該為我們網站上的所有節點做到這一點嗎?絕對不是!但這是一個非常基本的實現,旨在使情況保持簡短並展示插件衍生物的使用。 >

>插件衍生物

插件衍生物是可以在系統中表示某種類型的插件作為自身的多個實例的方式。換句話說,插件可以引用負責提供基於初始插件的插件定義列表(從同一基本定義開始)但具有略有不同的配置或定義數據的插件類別。我們上面提到的SystemMenublock是一個很好的例子。這是一個單個插件,具有與網站上的菜單一樣多的衍生詞。 >

>更深一些,當請求某個類型的所有插件的列表時,插件管理器使用其發現機制加載此類型的所有插件。如果該機制裝飾有衍生化合物的裝飾器,則經理也將能夠檢索衍生物。為了做到這一點,派生髮現在每個插件上尋找一個衍生程序類,如果找到一個插件,請為此列表詢問。

擴展DefaultPluginManager基類的

插件類型管理器通常應具有裝飾默認發現(註釋)的派生髮現機制。這是Drupal Core插件系統中最常見的模式:由衍生物包裹的註釋發現。

衍生類類

>我們知道插件衍生物的作用是什麼,讓我們創建將由塊插件使用的第一個deriver類(我們將在一分鐘內創建)。 演示模塊的

>內部src/plugin/dembin/derivative/nodeblock.php。

>我們所有類都需要實現的是deriverinterface並實現其兩種方法。我們使用containderiverInterface,因為我們想使我們的派生容器知道。為什麼?因為我們使用依賴項注入來加載Drupal的Entity Manager,以便我們可以訪問節點存儲(這是構造函數和Create()方法所做的)。此外,我們的deriver類從deriverbase類延伸,因為這已經處理了所需方法之一(getDerivativedEfinition())。最後,GetDerivativedEfinitions()是負責提供插件定義數組的方法,這些定義是從使用此類的插件中得出的。它接收$ base_plugin_definition作為參數(使用此衍生物的實際插件的定義),我們使用它來構建衍生物定義。在我們的情況下,我們不加打加載所有文章節點,對於每個節點,創建一個單獨的定義,該定義僅通過具有不同的admin_label(這是drupalcoreblockantationblock andotation entotation Class上的屬性)而有所不同。衍生物的數組由衍生物的ID鍵入(在我們的情況下,我們將稍後使用的節點ID)。

>我們需要提出的一個非常重要的一點是,從其中加載所有節點並創建插件從來都不是一個好主意。可能有趣的是實現功能,通過該功能可以通過複選框或類似的內容將單個節點作為塊暴露為塊。

>

塊插件

>現在我們有了我們的派生類,讓我們創建一個簡單的塊插件來使用它來生成自身的多個實例(每個文章節點一個)。

>內部src/plugin/block/nodeblock.php:

>我們在此插件的註釋中註意到的第一件事是指向我們之前創建的類的衍生鍵。這基本上就是我們要近兩者所需的全部。派生髮現裝飾器處理繁重的舉重。

>其他大部分是我們應該熟悉的基本塊構建。有趣的是,我們可以使用getDerivativeId()方法檢索我們也使用的節點ID作為所顯示的派生的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;
  }
}
登入後複製
>

>現在,如果我們清除緩存並導航到塊佈局接口,我們應該看到一些稱為節點塊的塊:[node title]。您可以將這些放置在您想要的位置,它們將渲染相關的節點。

結論

在本文中,我們研究了插件衍生物,並看到了它們如何工作的簡單示例。關鍵在此主題上是插件導數是我們動態聲明同一插件的多個實例的方式。它們通常可以幫助我們將用戶配置的功能(例如菜單)轉換為插件(例如菜單塊)。

。 為了說明衍生物的使用,我們已經看到了一種非常簡單的技術,它使我們能夠將文章節點作為塊。我們應該記住,雖然不要在網站上嘗試使用許多文章節點,而是實現限制暴露的節點數量的其他功能。你知道,所以我們不會崩潰我們的網站。

>問題?評論?您想進一步解釋嗎?讓我們知道!

>經常詢問有關使用Drupal 8插件衍生物有效的問題(常見問題解答)

什麼是Drupal 8插件衍生物,為什麼它們很重要?

drupal 8插件導數是Drupal 8的強大功能,它允許開發人員動態生成單個插件的多個實例。當您有大量類似的任務執行時,這特別有用,但是每個任務都需要略有不同的配置。通過使用插件導數,您可以創建一個基本插件,然後根據需要生成該插件的多種變化,每個插件都具有自己的獨特配置。這可以極大地簡化您的代碼,並使您的Drupal 8站點更加高效,更易於管理。

>

如何創建Drupal 8插件衍生物?

>創建Drupal 8插件涉及多個步驟。首先,您需要創建一個基本插件來定義所有衍生物都將共享的基本功能。接下來,您需要創建一個插件導數類,該類別擴展基本插件並實現派生界面。該課程負責產生單個衍生物。最後,您需要在Drupal的插件管理器上註冊您的插件導數,以便可以發現和使用它。

>

>我可以使用Drupal 8插件帶有自定義模塊的插件嗎?衍生物可以與自定義模塊一起使用。實際上,它們在這種情況下特別有用,因為它們允許您創建一個基本模塊,然後生成該模塊的多個變體,每個模塊都有其獨特的配置。這可以極大地簡化開發過程,並使您的自定義模塊更有效,更易於管理。

>

> drupal 8插件衍生物有哪些常見用例?

drupal 8插件衍生物具有難以置信的通用性可以在各種場景中使用。一些常見用例包括創建塊插件的多個實例,每個實例都具有不同的配置;從單個基礎插件生成多個菜單鏈接;並創建自定義模塊的多個變體,每個模塊都針對特定的任務或要求量身定制。

>

>如何管理和維護Drupal 8插件導數?跟踪基本插件及其所有導數,以確保它們都是最新的,並且可以正確運行。這可以通過Drupal的插件管理器來完成,該插件管理器提供了用於管理所有插件的集中式接口。此外,重要的是要定期查看和更新​​您的插件衍生詞,以確保它們繼續滿足您網站用戶的需求和需求。

使用Drupal 8插件衍生詞有任何限製或挑戰?

,而Drupal 8插件導數是一個強大的工具,它們確實面臨一些挑戰。主要挑戰之一是它們可以建立和管理很複雜,尤其是對於新手或不熟悉其插件系統的開發人員而言。此外,由於每個派生型都是單個基本插件的變體,因此對基本插件的更改可能會影響其所有衍生物,因此需要仔細的管理和測試。 我可以使用Drupal 8插件帶有第三個插件派對插件?

是的,Drupal 8插件衍生物可以與第三方插件一起使用。但是,重要的是要注意,並非所有第三方插件都旨在支持衍生產品,因此您可能需要做一些其他工作以使其兼容。始終檢查您使用的特定插件的文檔,以查看它是否支持衍生產品以及如何實現它們。

>

> drupal 8插件導數如何改善站點性能?

drupal 8插件衍生物可以通過減少每個任務需要執行的代碼數量來提高站點性能。通過創建一個基本插件,然後生成多個導數,您可以避免為每個任務編寫和執行單獨的代碼。這可能會導致性能的重大提升,尤其是對於具有大量類似任務的網站。

>

>如何調試Drupal 8插件導數的問題?由於其動態性質,可能會具有挑戰性。但是,Drupal提供了幾種幫助解決此問題的工具和技術。最有用的是Devel模塊,該模塊提供了一系列調試和開發工具。此外,Drupal的錯誤記錄和報告功能可以提供有關出現的任何問題的有價值的信息。

>

>在哪裡可以找到更多有關使用Drupal 8插件衍生詞的資源?了解有關Drupal 8插件衍生物的更多信息。官方的Drupal文檔是一個不錯的起點,因為它提供了有關Drupal開發各個方面的全面信息,包括插件衍生產品。此外,還有許多教程,博客文章和論壇討論,可以深入涵蓋此主題。

以上是有效使用Drupal 8插件衍生物的教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板