可能在模型中使用RequestHandlerComponent吗?

时间:2009-08-03 07:37:59

标签: cakephp requesthandler

我是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

2 个答案:

答案 0 :(得分:4)

组件,按设计,不适用于模型(没有绕过MVC约定 - 当然,您可以这样做)。如果您选择强制它可用,请查看ClassRegistry::init()。我认为,更好的解决方案是在控制器中使用RequestHandler组件(它意味着使用它),在控制器中设置lastActiveIp值(就像你在控制器中显示的那样)自己的示例代码)并将整个数据数组传递给模型。

现在你的组件正在被应用的地方使用,模型仍然无视 它获取数据的地方。存在过度简化的风险,所有模型应该知道一旦数据到达该如何处理数据;让控制器担心收集和打包数据。

答案 1 :(得分:1)

除了Rob的回答之外,也许只需将一些代码放在一起就可以使用一般env('REMOTE_ADDR')或类似的变量。看看RequestHandler代码,它没有做任何非常复杂的事情。

您甚至可以静态调用组件,这比在模型中实例化它稍微好一点(尽管仍然违反了MVC)。未经测试,但应该工作:

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