目录
钥匙要点
>
drupal 8插件衍生物具有难以置信的通用性可以在各种场景中使用。一些常见用例包括创建块插件的多个实例,每个实例都具有不同的配置;从单个基础插件生成多个菜单链接;并创建自定义模块的多个变体,每个模块都针对特定的任务或要求量身定制。
使用Drupal 8插件衍生词有任何限制或挑战?
是的,Drupal 8插件衍生物可以与第三方插件一起使用。但是,重要的是要注意,并非所有第三方插件都旨在支持衍生产品,因此您可能需要做一些其他工作以使其兼容。始终检查您使用的特定插件的文档,以查看它是否支持衍生产品以及如何实现它们。
>如何调试Drupal 8插件导数的问题?由于其动态性质,可能会具有挑战性。但是,Drupal提供了几种帮助解决此问题的工具和技术。最有用的是Devel模块,该模块提供了一系列调试和开发工具。此外,Drupal的错误记录和报告功能可以提供有关出现的任何问题的有价值的信息。
首页 后端开发 php教程 有效使用Drupal 8插件衍生物的教程

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

Feb 16, 2025 am 11:26 AM

有效使用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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章讨论了框架中的基本安全功能,以防止漏洞,包括输入验证,身份验证和常规更新。

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

See all articles