>但是,如果我們需要這樣的
實例>動態聲明,具體取決於我們小子系統外部的某些因素?例如,當在Drupal 7中聲明_info鉤子時,我們可以獲得
的列表,循環循環並在返回的數組中為每個單獨的> something 聲明一個新項目。菜單系統這樣做是為了為每個菜單提供一個新塊,該菜單帶有Drupal Core,或者以後通過UI創建。 > Drupal 8呢?我們已經看到,對於某種類型的每個插件,我們需要聲明其他PHP類。要創建一個新的塊,我們需要一個新類。要創建另一個塊,我們需要另一個類。那麼,我們在Drupal 7中看到的循環在哪裡?對此的簡短答案是:在>插件中 在本文中,我們將探索對此的長期答案,並了解派生是什麼以及如何使用它們。對於後者,我們將在演示模塊中構建一個示例,該示例可以在此GIT存儲庫中找到,並希望它可以幫助我們更好地了解發生了什麼。對於一個稍微複雜的示例,菜單系統非常好,因為它為其每個菜單提供了一個單獨的塊(類似於Drupal 7,但使用插件)。
>我們要做的實際上非常簡單。我們將實現基本節點塊功能,通過該功能,對於我們網站上的所有文章節點,我們都將擁有一個塊。荒謬的?當然。我們應該為我們網站上的所有節點做到這一點嗎?絕對不是!但這是一個非常基本的實現,旨在使情況保持簡短並展示插件衍生物的使用。
>更深一些,當請求某個類型的所有插件的列表時,插件管理器使用其發現機制加載此類型的所有插件。如果該機制裝飾有衍生化合物的裝飾器,則經理也將能夠檢索衍生物。為了做到這一點,派生髮現在每個插件上尋找一個衍生程序類,如果找到一個插件,請為此列表詢問。
擴展DefaultPluginManager基類的插件類型管理器通常應具有裝飾默認發現(註釋)的派生髮現機制。這是Drupal Core插件系統中最常見的模式:由衍生物包裹的註釋發現。
衍生類類
>我們所有類都需要實現的是deriverinterface並實現其兩種方法。我們使用containderiverInterface,因為我們想使我們的派生容器知道。為什麼?因為我們使用依賴項注入來加載Drupal的Entity Manager,以便我們可以訪問節點存儲(這是構造函數和Create()方法所做的)。此外,我們的deriver類從deriverbase類延伸,因為這已經處理了所需方法之一(getDerivativedEfinition())。最後,GetDerivativedEfinitions()是負責提供插件定義數組的方法,這些定義是從使用此類的插件中得出的。它接收$ base_plugin_definition作為參數(使用此衍生物的實際插件的定義),我們使用它來構建衍生物定義。在我們的情況下,我們不加打加載所有文章節點,對於每個節點,創建一個單獨的定義,該定義僅通過具有不同的admin_label(這是drupalcoreblockantationblock andotation entotation Class上的屬性)而有所不同。衍生物的數組由衍生物的ID鍵入(在我們的情況下,我們將稍後使用的節點ID)。
>我們需要提出的一個非常重要的一點是,從其中加載所有節點並創建插件從來都不是一個好主意。可能有趣的是實現功能,通過該功能可以通過複選框或類似的內容將單個節點作為塊暴露為塊。
>塊插件
>我們在此插件的註釋中註意到的第一件事是指向我們之前創建的類的衍生鍵。這基本上就是我們要近兩者所需的全部。派生髮現裝飾器處理繁重的舉重。
>其他大部分是我們應該熟悉的基本塊構建。有趣的是,我們可以使用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的插件管理器來完成,該插件管理器提供了用於管理所有插件的集中式接口。此外,重要的是要定期查看和更新您的插件衍生詞,以確保它們繼續滿足您網站用戶的需求和需求。
,而Drupal 8插件導數是一個強大的工具,它們確實面臨一些挑戰。主要挑戰之一是它們可以建立和管理很複雜,尤其是對於新手或不熟悉其插件系統的開發人員而言。此外,由於每個派生型都是單個基本插件的變體,因此對基本插件的更改可能會影響其所有衍生物,因此需要仔細的管理和測試。
> drupal 8插件導數如何改善站點性能?
drupal 8插件衍生物可以通過減少每個任務需要執行的代碼數量來提高站點性能。通過創建一個基本插件,然後生成多個導數,您可以避免為每個任務編寫和執行單獨的代碼。這可能會導致性能的重大提升,尤其是對於具有大量類似任務的網站。
>>在哪裡可以找到更多有關使用Drupal 8插件衍生詞的資源?了解有關Drupal 8插件衍生物的更多信息。官方的Drupal文檔是一個不錯的起點,因為它提供了有關Drupal開發各個方面的全面信息,包括插件衍生產品。此外,還有許多教程,博客文章和論壇討論,可以深入涵蓋此主題。
以上是有效使用Drupal 8插件衍生物的教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!