2009-08-03 3 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

1

В дополнение к ответу Роба, возможно, этого достаточно, чтобы поместить немного кода вместе, используя общие env('REMOTE_ADDR') или аналогичные переменные. Посмотрите на код RequestHandler, это не делает ничего ужасно сложного.

Возможно, вы даже сможете вызвать компонент статически, что немного лучше, чем создавать его в модели (все еще в нарушение MVC). Непроверенный, но должен работать:

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

Спасибо за помощь, но поскольку я, кажется, нарушаю конвенцию MVC, возможно, лучше я это делаю в контроллере. – Brandon

Смежные вопросы