Где я должен разместить этот метод на сайте, управляемом CakePHP?
Вопрос
Я пишу приложение, используя CakePHP, и я не уверен относительно того, куда мне следует поместить свой generateMapUrl
функция.
function generateMapUrl($id = null) {
if ( !$id ) {
$this->Session->setFlash('Invalid Property Id');
}
$this->read(null, $id);
$url = "http://maps.google.com/maps?oi=map&q=";
$url .= $this->data['street_num'] . '+';
$url .= $this->data['street'] . '+';
$url .= $this->data['city'] . '+';
$url .= $this->data['province'] . '+';
$url .= $this->data['country'] . '+';
$url .= $this->data['postal_code'];
return $url;
}
У меня есть следующая структура:
Бронирование (Модель и Контроллер)
Свойства (модель и контроллер)
Адрес (модель и контроллер)
Бронирование hasOne
Собственность и Свойство hasOne
Адрес.Я хотел бы иметь возможность позвонить generateMapUrl
для любого Адреса.Однако я не уверен относительно того, куда поместить этот метод...Контроллер адреса?Адресная модель?(Примечание:Я вызываю этот метод из контроллера бронирования)
Решение
Метод generateMapUrl() должен быть методом в вашей адресной модели, поскольку он имеет дело с выборкой и форматированием адресных данных, но должен возвращать false и не содержать сеансовых вызовов:
function generateMapUrl($id = null) {
$this->recursive = -1;
if (!$this->read(null, $id)) {
return false;
}
$url = "http://maps.google.com/maps?oi=map&q=";
$url .= $this->data['street_num'] . '+';
$url .= $this->data['street'] . '+';
$url .= $this->data['city'] . '+';
$url .= $this->data['province'] . '+';
$url .= $this->data['country'] . '+';
$url .= $this->data['postal_code'];
return $url;
}
Затем вы можете вызвать это с любого контроллера и использовать сеансовые вызовы там:
function x() {
if (!$mapUrl = ClassRegistry::init('Address')->generateMapUrl($addressId)) {
$this->Session->setFlash('Invalid Property Id');
}
}
Другие советы
В контроллере у него есть данные сеанса.Модель не должна знать о каких-либо состояниях сеанса.
Я мог бы рассмотреть возможность создания класса AddressMapUrlGenerator и использовать его для создания URL-адреса.Вы могли бы передать ему Адрес.Таким образом, вы не будете запутывать Модель заботами о URL-адресах или картах, и в будущем у вас не будет проблем с распределением одной и той же функции более чем на одном контроллере.
В модели создайте класс GoogleAddress.Затем используйте GoogleAddress в контроллере.
По крайней мере, происходят три вещи:
1) Создание URL 2) Обработка ошибок 3) И, хотя и не явный, фактический вызов.
Созданием URL-адреса должен заниматься специальный вспомогательный класс.Вероятно, лучше всего провести проверку на контроллере, поскольку фактический код проверки будет находиться в другом месте.Обработка ошибок должна быть на контроллере, так как он должен был бы делать что-то особенное, требуемое для конкретного места, в котором находится пользователь.Наконец, сам вызов, конечно, должен выполняться на контроллере.