我的beforeMarshal ()
函数位于ModelTable.php
。此函数在保存请求数据之前正确执行,但每次保存数据时都会收到php警告。
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
$ip = $data['ip'];
$data['iplong'] = ip2long($ip);
}
警告(4096):传递给App \ Model \ Table \ ServersTable :: beforeMarshal()的参数1必须是App \ Model \ Table \ Event的实例,Cake \ Event \ Event实例
警告(4096):传递给App \ Model \ Table \ ServersTable :: beforeMarshal()的参数2必须是App \ Model \ Table \ ArrayObject的实例,给定的ArrayObject实例
警告(4096):传递给App \ Model \ Table \ ServersTable :: beforeMarshal()的参数3必须是App \ Model \ Table \ ArrayObject的实例,给定的ArrayObject实例
如果我将debug设置为false,一切都很好,但这不是一个很好的解决方案。
答案 0 :(得分:9)
这可能是一个namespace问题。错误是该函数需要一个精确类型的对象,它接收另一个。
我假设beforeMarshal()
是您自己的自定义函数,它位于命名空间App\Model\Table
中(因为它属于ModelTable
类)。
此外,您可能正在从未指定命名空间的其他文件中调用它,因此它会将自身视为全局命名空间。
或者
use
ModelTable.php
精确类型提示
将您的功能定义更改为:
public function beforeMarshal(\Cake\Event\Event $event, \ArrayObject $data, \ArrayObject $options)
注意反斜杠。它们在考虑对象类型时指示函数从全局命名空间开始。
全球use
在ModelTable.php
脚本(或包含该功能的脚本)的最顶部添加:
use
Cake\Event\Event,
ArrayObject;
因此,在整个脚本中,Event
和ArrayObject
类型的任何使用都将使用正确的类型,而不是每次都指定整个名称。
意见如下
我更喜欢在脚本的顶部使用use
。它可以防止在此特定脚本中出现任何类型的滥用行为,当我必须将ALL\Templating\Parser
更改为ALL\Parser
时,我只需要在一个地方执行此操作。
每次都指定整个对象命名空间路径是麻烦的,而且更容易出错,但可能有优势;自从我开始使用它以来,我没有经历过它们并且没有停止全局方法。
答案 1 :(得分:-1)
只需删除Event,ArrayObject关键字,然后按以下方式编写:
public function beforeMarshal($event, $data, $options)
{
$ip = $data['ip'];
$data['iplong'] = ip2long($ip);
}
我希望这可以解决你的问题。