Возможно ли использование RequestHandlerComponent в модели? - PullRequest
2 голосов
/ 03 августа 2009

Я новичок в PHP и решил использовать инфраструктуру cakePHP, чтобы помочь мне начать работу.

Я не могу понять одну вещь, хотя я хочу вызывать методы в классе RequestHandlerComponent для обновления последнего использованного IP-адреса пользователя и другой информации, я решил, что лучшее место для этого - метод beforeSave () на модели User.

Я не могу понять, как вызвать метод 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 ]

4 голосов
/ 03 августа 2009

Компоненты по своей конструкции недоступны для моделей (без обхода соглашения MVC - что вы, конечно, можете сделать). Если вы решили сделать его доступным, посмотрите на ClassRegistry::init(). Я думаю, что лучшим решением было бы использовать компонент RequestHandler в вашем контроллере (где он должен использоваться), установить значение lastActiveIp в контроллере (точно так, как вы показали в своем собственном примере кода) и передать весь массив данных в модель.

Теперь ваш компонент используется там, где он должен быть, и модель остается в неведении относительно , где она получает свои данные. Во избежание чрезмерного упрощения все модели должны знать, что делать с данными после их поступления; пусть контроллер беспокоится о сборе и упаковке данных.

1 голос
/ 03 августа 2009

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

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

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