钥匙要点
-
Drupal 8中的
- 插件衍生物允许同一插件的多个实例的动态声明,将用户配置的功能转换为插件。 > deriver类用于提供基于初始插件但具有略有不同配置或定义数据的插件定义的列表。
- > >插件管理器中的派生式coveryDecorator用于检索衍生词,在每个插件上寻找派生类并询问列表。
- > >插件导数是一种功能强大的工具,但它们可以设置和管理很复杂,尤其是对于新手Drupal或不熟悉其插件系统的开发人员。需要仔细的管理和测试,因为对基本插件的更改可能会影响其所有导数。
- 在较早的教程中,我们查看了Drupal 8插件系统以及如何创建自己的自定义插件类型。我们已经看到,Drupal 7中通过_info钩声声明的许多功能已被这些插件替换。我们的用例非常基本,并且可以通过新的插件类和关联的表单手动声明此类功能的每个 实例
>但是,如果我们需要这样的
实例>动态声明,具体取决于我们小子系统外部的某些因素?例如,当在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提供了几种帮助解决此问题的工具和技术。最有用的是Devel模块,该模块提供了一系列调试和开发工具。此外,Drupal的错误记录和报告功能可以提供有关出现的任何问题的有价值的信息。
>>在哪里可以找到更多有关使用Drupal 8插件衍生词的资源?了解有关Drupal 8插件衍生物的更多信息。官方的Drupal文档是一个不错的起点,因为它提供了有关Drupal开发各个方面的全面信息,包括插件衍生产品。此外,还有许多教程,博客文章和论坛讨论,可以深入涵盖此主题。
以上是有效使用Drupal 8插件衍生物的教程的详细内容。更多信息请关注PHP中文网其他相关文章!

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。

要保护应用免受与会话相关的XSS攻击,需采取以下措施:1.设置HttpOnly和Secure标志保护会话cookie。2.对所有用户输入进行输出编码。3.实施内容安全策略(CSP)限制脚本来源。通过这些策略,可以有效防护会话相关的XSS攻击,确保用户数据安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显着提升应用在高并发环境下的效率。

thesession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceIsiseededeedeedeedeedeedeedto to to avoidperformance andununununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函数配置会话名称。具体步骤如下:1.使用session_name()函数设置会话名称,例如session_name("my_session")。2.在设置会话名称后,调用session_start()启动会话。配置会话名称可以避免多应用间的会话数据冲突,并增强安全性,但需注意会话名称的唯一性、安全性、长度和设置时机。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载
最流行的的开源编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3汉化版
中文版,非常好用

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。