我是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
答案 0 :(得分:4)
组件,按设计,不适用于模型(没有绕过MVC约定 - 当然,您可以这样做)。如果您选择强制它可用,请查看ClassRegistry::init()
。我认为,更好的解决方案是在控制器中使用RequestHandler
组件(它意味着使用它),在控制器中设置lastActiveIp
值(就像你在控制器中显示的那样)自己的示例代码)并将整个数据数组传递给模型。
现在你的组件正在被应用的地方使用,模型仍然无视 它获取数据的地方。存在过度简化的风险,所有模型应该知道一旦数据到达该如何处理数据;让控制器担心收集和打包数据。
答案 1 :(得分:1)
除了Rob的回答之外,也许只需将一些代码放在一起就可以使用一般env('REMOTE_ADDR')
或类似的变量。看看RequestHandler
代码,它没有做任何非常复杂的事情。
您甚至可以静态调用组件,这比在模型中实例化它稍微好一点(尽管仍然违反了MVC)。未经测试,但应该工作:
App::import('Component', 'RequestHandler');
RequestHandlerComponent::getClientIp();