Cakephp 在模型中使用RequestHandlerComponent是否可行?

Cakephp 在模型中使用RequestHandlerComponent是否可行?,cakephp,requesthandler,Cakephp,Requesthandler,我是PHP新手,决定使用cakePHP框架帮助我入门 但是我想不出一件事,我想调用RequestHandlerComponent类上的方法来更新用户上次使用的IP地址和其他信息,我想最好放在用户模型上的beforeSave()方法中 但是我不知道如何调用getClientIP方法 否则会进入控制器的正常代码不起作用。如果您在模型中而不是控制器中,是否有其他方法调用此类 班级级别: var $components = array('RequestHandler'); 在函数中: $this-&g

我是PHP新手,决定使用cakePHP框架帮助我入门

但是我想不出一件事,我想调用RequestHandlerComponent类上的方法来更新用户上次使用的IP地址和其他信息,我想最好放在用户模型上的beforeSave()方法中

但是我不知道如何调用getClientIP方法

否则会进入控制器的正常代码不起作用。如果您在模型中而不是控制器中,是否有其他方法调用此类

班级级别:

var $components = array('RequestHandler');
在函数中:

$this->data['User']['lastActiveIP'] = $this->RequestHandler->getClientIP();
给出:

Undefined property: User::$RequestHandler
Call to a member function getClientIP() on a non-object

从设计上讲,组件对模型是不可用的(如果不绕过MVC约定,当然可以这样做)。如果您选择强制它可用,请查看
ClassRegistry::init()
。我认为,更好的解决方案是在控制器中使用
RequestHandler
组件(它将被使用的地方),在控制器中设置
lastActiveIp
值(正如您在自己的示例代码中所示),并将整个数据数组传递给模型


现在,您的组件被使用在它应该使用的地方,而模型仍然不知道它从哪里获得数据。冒着过分简化的风险,模型应该知道的是一旦数据到达,该如何处理;让控制器来担心数据的收集和打包。

除了Rob的答案之外,您自己使用general
env('REMOTE\u ADDR')
或类似变量编写一些代码就足够了。看看
RequestHandler
代码,它没有做任何非常复杂的事情

您甚至可以静态地调用组件,这比在模型中实例化组件要好一些(尽管仍然违反MVC)。未经测试,但应有效:

App::import('Component', 'RequestHandler');
RequestHandlerComponent::getClientIp();

谢谢你的回答,我不认为我在尝试MVC约定时违反了MVC约定。谢谢你的帮助,但是因为我似乎违反了MVC约定,所以我最好还是在控制器里做这个。