>但是,如果我们需要这样的
实例>动态声明,具体取决于我们小子系统外部的某些因素?例如,当在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中文网其他相关文章!