【问题标题】:Is using the RequestHandlerComponent in a model possible?是否可以在模型中使用 RequestHandlerComponent?
【发布时间】:2010-11-16 07:19:12
【问题描述】:

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

【问题讨论】:

    标签: cakephp requesthandler


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答,我尝试的时候并不认为我违反了 MVC 约定。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的帮助,但由于我似乎违反了 MVC 约定,所以我在控制器中执行此操作可能更好。
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多