Использование переменных сеанса внутри модели с помощью cakephp

#session #cakephp #model #authentication

#сеанс #cakephp #Модель #аутентификация

Вопрос:

Возникли проблемы с поиском четкого ответа на, казалось бы, простой вопрос.

Я извлекаю даты из базы данных с помощью find (). У меня есть смещение часового пояса пользователя (-5, -6 и т.д.) В переменных сеанса (предоставленных аутентификацией). Я хочу использовать обратный вызов afterFind () для обновления времени в соответствии с часовым поясом пользователя перед отображением, а затем обратный вызов beforeSave () для настройки обратно на GMT при повторном сохранении.

Как мне получить доступ к переменным аутентификации внутри функции afterFind в модели?

Спасибо!

Ответ №1:

Поскольку Auth-компонент является расширением контроллера, не существует «естественного» способа включить это в вашу модель.

Вы могли бы сделать App::import('Controller', 'Users') или где бы вы это ни делали.

Вы можете увидеть, как вы можете использовать эту функцию здесь: Используя App::import

Но я действительно думаю, что, поскольку это всего лишь вопрос отображения некоторой информации, помощник был бы лучшим решением для вашей проблемы (для обслуживания «V» в MVC).

Вы могли бы написать помощник, который берет вашу дату (я думаю, вы используете либо DATE либо DATETIME в своей базе данных) и преобразует ее в правильный часовой пояс.

 function convert_timezone($time)
    $timezone = $this->Session->read('Auth.timezone');
    date_default_timezone_set($timezone); //set the correct timezone which we read from the Session
    return gmdate("M d Y H:i:s", strtotime($time)); //using strtotime to convert the time from the database to a timestamp
}
  

Пожалуйста, взгляните на эти информационные ссылки о том, как написать свой собственный помощник, функцию gmdate и помощник сеанса из CakePHP.

Методы помощника сеанса

Написание собственных помощников

Функция gmdate PHPs

Комментарии:

1. Да, после экспериментов с этими вещами кажется, что использование afterFind и beforeSave — не лучший способ сделать это. Я пытаюсь манипулировать слишком большим количеством данных, и мне приходится использовать App:: import () повсюду и сеять хаос в MVC. В итоге я создал компонент, который будет манипулировать данными в контроллерах, прежде чем отправлять их в представление. Спасибо!