ReshapeArgumentsAware

一个用于重塑参数的 Trait,以保持与旧版插件事件的兼容性。

已弃用

旧版插件事件处理程序期望位置参数,而不是命名参数,因为它们是简单的 PHP 方法,例如 public onExample($foo, $bar, $baz)。但是,具体的事件类使用命名参数,这些参数可以以任何顺序传递。以下两个示例等效:$event1 = new ConcreteEventClass('onExample', ['foo' => 1, 'bar' => 2, 'baz' => 3]; $event2 = new ConcreteEventClass('onExample', ['bar' => 2, 'baz' => 3, 'foo' => 1,]; 但是,这意味着事件对象的内部 $arguments 属性在每种情况下都以**不同**的顺序保存命名参数。

当事件处理程序知道 ConcreteEventClass 时,它可以检索命名参数,一切正常。但是,当您通过 CMSPlugin::registerLegacyListener 注册旧版插件监听器时,就会出现一个大问题!旧版监听器正在**按位置**传递参数,按照它们添加到事件对象的顺序传递。

在前面的示例中,$event1 可以按预期工作,因为 foo、bar 和 baz 参数以旧版监听器期望的相同顺序给出。另一方面,$event2 会惨遭失败,因为调用顺序将是 $bar、$baz、$foo,这**不是**旧版监听器期望的。

解决此问题的唯一方法是在具体事件的构造函数中重塑参数,以便确保参数的顺序与旧版监听器期望的相同。此外,由于 Joomla 将所有参数(除了“result”参数)盲目地传递给旧版监听器,因此我们必须确保 a. 设置所有必要的参数,以及 b. 任何其他命名参数**不存在**。否则,我们的旧版监听器将接收错误数量的位置参数并中断。

此特性中的 reshapeArguments() 方法实现了所有这些功能,该方法必须在具体事件类的构造函数中调用。

此特性被标记为已弃用,目标版本为 6.0,因为在 Joomla 6 中,我们只使用带有命名参数的具体事件类,删除旧版监听器及其位置参数带来的麻烦。

4.2.0

已弃用

4.3 将在 6.0 中删除 将在没有替换的情况下删除

Joomla CMS

方法

reshapeArguments

重塑参数数组以保持与旧版监听器的兼容性

reshapeArguments(mixed||string|int arguments, mixed||string|int argumentNames, mixed||string|int defaults = []) : mixed||string|int

4.2.0

参数

参数

array<string|int, mixed>传递给构造函数的命名参数数组。

参数名称

array<string|int, mixed>允许的参数名称(必需和可选)。

默认值

array<string|int, mixed>可选参数的默认值。

响应

array<string|int, mixed>重塑后的参数。