Где я должен поместить этот метод в CakePHP-управляемый сайт? - PullRequest
0 голосов
/ 04 марта 2009

Я пишу приложение, используя 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 для любого адреса. Я не уверен относительно того, где поставить метод, хотя ... Адрес контроллера? Модель адреса? (Примечание: я вызываю этот метод из контроллера Bookings)

Ответы [ 5 ]

3 голосов
/ 04 марта 2009

В контроллере есть данные сеанса. Модель не должна знать о каких-либо состояниях сеанса.

0 голосов
/ 04 марта 2009

Метод generateMapUrl () должен быть методом в вашей модели Address, поскольку он имеет дело с выборкой и форматированием данных Address, но должен возвращать 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');
  }
}
0 голосов
/ 04 марта 2009

По крайней мере, происходит три вещи:

1) Создание URL 2) Обработка ошибок 3) И хотя не явно, фактический вызов.

Создание URL-адреса должно выполняться специальным вспомогательным классом. Скорее всего, лучше всего провести проверку на контроллере, фактический код проверки будет находиться в другом месте. Обработка ошибок должна быть на контроллере, поскольку она должна была бы делать что-то особенное, необходимое для конкретного места, где находится пользователь. Наконец, сам вызов, конечно же, должен осуществляться на контроллере.

0 голосов
/ 04 марта 2009

В модели построить класс GoogleAddress. Затем используйте адрес GoogleAddress в контроллере.

0 голосов
/ 04 марта 2009

Я мог бы рассмотреть возможность создания класса AddressMapUrlGenerator и использования его для создания URL. Вы можете передать это адрес. Таким образом, вы не будете путать Модель с заботами об URL-адресах или картах, и у вас не будет будущих забот о распространении одной и той же функции более чем в одном Контроллере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...