Domanda

Sto scrivendo un'applicazione usando CakePHP e non sono sicuro di dove dovrei inserire la mia funzione 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;
}

Ho la seguente struttura:

  

Prenotazione (Model & amp; Controller)
  Proprietà (Model & amp; Controller)
  Indirizzo (Model & amp; Controller)

Una proprietà hasOne e un indirizzo hasOne . Vorrei poter chiamare generateMapUrl per qualsiasi indirizzo. Non sono sicuro di dove mettere il metodo però ... Controller di indirizzi? Modello di indirizzo? (Nota: sto chiamando questo metodo dal controller di prenotazioni)

È stato utile?

Soluzione

Il metodo generateMapUrl () dovrebbe essere un metodo nel tuo modello di indirizzo in quanto si tratta di recuperare e formattare i dati dell'indirizzo, ma dovrebbe restituire false e non contenere le chiamate di sessione:

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;
}

Puoi quindi chiamarlo da qualsiasi controller e usare le chiamate di sessione lì:

function x() {
  if (!$mapUrl = ClassRegistry::init('Address')->generateMapUrl($addressId)) {
    $this->Session->setFlash('Invalid Property Id');
  }
}

Altri suggerimenti

Nel controller contiene dati di sessione. Il modello non dovrebbe essere a conoscenza di alcuno stato della sessione.

Potrei considerare la creazione di una classe AddressMapUrlGenerator e il suo utilizzo per creare l'URL. Potresti passargli un indirizzo. In questo modo, non confonderai il Modello con preoccupazioni per gli URL o le mappe e non avrai preoccupazioni future per avere la stessa funzione distribuita in più di un Controller.

Nel modello crea una classe GoogleAddress. Quindi utilizza GoogleAddress nel controller.

Perlomeno, stanno accadendo tre cose:

1) Creazione dell'URL 2) Gestione degli errori 3) E sebbene non esplicito, la chiamata effettiva.

La creazione dell'URL deve essere gestita da una classe di supporto dedicata. È preferibile che il controllo venga eseguito sul controller, il codice di controllo effettivo risiederebbe altrove. La gestione degli errori dovrebbe essere sul controller, in quanto dovrebbe fare qualsiasi cosa speciale richiesta per il luogo specifico in cui si trova l'utente. Infine, la chiamata stessa dovrebbe ovviamente aver luogo sul controller.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top