Pregunta

Estoy escribiendo una aplicación usando CakePHP y no estoy seguro de dónde debería colocar mi función 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;
}

Tengo la siguiente estructura:

  

Reserva (Modelo y controlador)
  Propiedades (modelo y controlador)
  Dirección (modelo y controlador)

Una propiedad hasOne de la reserva y una dirección hasOne de la propiedad. Me gustaría poder llamar a generateMapUrl para cualquier dirección. Sin embargo, no estoy seguro de dónde colocar el método ... ¿Controlador de direcciones? ¿Modelo de dirección? (Nota: estoy llamando a este método desde el controlador de Reservas)

¿Fue útil?

Solución

El método generateMapUrl () debe ser un método en su modelo de dirección, ya que se trata de recuperar y formatear los datos de la dirección, pero debe devolver falso y no contener las llamadas de sesión:

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

Luego puedes llamar a esto desde cualquier controlador y usar las llamadas de sesión allí:

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

Otros consejos

En el Controlador, tiene datos de sesión. El modelo no debe conocer ningún estado de sesión.

Podría considerar crear una clase de AddressMapUrlGenerator y usarla para crear la URL. Podrías pasarle una dirección. De esa manera, no se confundirá con el Modelo con preocupaciones sobre direcciones URL o mapas, y no tendrá preocupaciones futuras sobre la posibilidad de que la misma función se extienda en más de un Controlador.

En el modelo, construye una clase de dirección de Google. Luego use la dirección de Google en el controlador.

Por lo menos, están sucediendo tres cosas:

1) Creación de la URL 2) Manejo de errores 3) Y aunque no explícito, la llamada real.

La creación de la URL debe ser manejada por una clase auxiliar dedicada. Es probable que lo mejor sea que la verificación se realice en el controlador, el código de verificación real residiría en otro lugar. El manejo de errores debe estar en el controlador, ya que tendría que hacer cualquier cosa especial requerida para el lugar específico en el que se encuentra el usuario. Por último, la llamada en sí, por supuesto, debería tener lugar en el controlador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top