2009-08-03 34 views
2

我是PHP新手,並決定使用cakePHP框架來幫助我開始。正在模型中使用RequestHandlerComponent嗎?

雖然我無法弄清楚一件事,但我想調用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

組件,通過設計,不向模型(不繞開MVC約定 - 當然你可以這樣做)。如果您選擇強制它可用,請查看ClassRegistry::init()。我認爲更好的解決方案是在你的控制器中使用RequestHandler組件,在控制器中設置lastActiveIp的值(正如你在自己的示例代碼中所示),並將整個數據陣列沿着模型。

現在您的組件正在被使用,它應該在什麼地方,模型會對保持無知,其中它獲取其數據。在過度簡化的風險下,所有模型都應該知道數據到達後應該如何處理;讓控制器擔心收集和打包數據。

+0

感謝您的回答,我不認爲我在嘗試它時違反了MVC慣例。 – Brandon 2009-08-03 17:29:58

1

除了羅布的回答,也許這足以讓你自己編一些代碼,使用一般的​​或類似的變量。看看RequestHandler的代碼,它沒有做任何非常複雜的事情。

您甚至可以靜態調用該組件,這比在模型中實例化它稍好一些(仍然違反了MVC)。未經測試,但應該工作:

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

感謝您的幫助,但是因爲我似乎打破了MVC約定,所以我可能會更好地在控制器中執行此操作。 – Brandon 2009-08-03 17:30:41

相關問題