Где я должен разместить этот метод на сайте, управляемом CakePHP?

StackOverflow https://stackoverflow.com/questions/608812

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пишу приложение, используя 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-адреса должен заниматься специальный вспомогательный класс.Вероятно, лучше всего провести проверку на контроллере, поскольку фактический код проверки будет находиться в другом месте.Обработка ошибок должна быть на контроллере, так как он должен был бы делать что-то особенное, требуемое для конкретного места, в котором находится пользователь.Наконец, сам вызов, конечно, должен выполняться на контроллере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top