2

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

2 回答 2

4

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

现在你的组件被用在了它应该在的地方,而模型却不知道它从哪里获取数据。冒着过度简化的风险,所有模型都应该知道数据到达后如何处理;让控制器担心收集和打包数据。

于 2009-08-03T11:44:10.957 回答
1

除了 Rob 的答案之外,也许自己将一些使用通用env('REMOTE_ADDR')或类似变量的代码放在一起就足够了。看看RequestHandler代码,它并没有做任何非常复杂的事情。

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

App::import('Component', 'RequestHandler');
RequestHandlerComponent::getClientIp();
于 2009-08-03T11:54:25.487 回答