Pergunta

Eu estou escrevendo um aplicativo usando CakePHP e eu tenho certeza de onde eu deveria estar colocando minha função 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;
}

Eu tenho a seguinte estrutura:

Booking (Modelo & Controller)
Properties (Modelo & Controller)
Endereço (Modelo & Controller)

A Reserva hasOne propriedade e uma hasOne propriedade de endereço. Eu gostaria de ser capaz de chamar generateMapUrl para qualquer endereço. Estou inseguro quanto a onde colocar o método embora ... Endereço controlador? Morada do modelo? (Nota: Eu estou chamando este método a partir do controlador Reservas)

Foi útil?

Solução

O método generateMapUrl () deve ser um método no seu modelo de endereço, como é lidar com busca e formatação de dados de endereços, mas deve retornar false e não contêm as chamadas de sessão:

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

Você pode então chamar isso de qualquer controlador e usar as chamadas de sessão lá:

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

Outras dicas

No Controller, que tem os dados da sessão. O modelo não deve estar ciente de quaisquer estados de sessão.

Eu poderia considerar a criação de uma classe AddressMapUrlGenerator e usá-lo para criar a URL. Você poderia passar o endereço. Dessa forma, você não será atrapalhando o modelo com preocupações sobre urls ou mapas, e você não terá preocupações futuras sobre ter a mesma função espalhados em mais de um controlador.

No modelo de criar uma classe GoogleAddress. Em seguida, use o GoogleAddress no controlador.

No mínimo, há três coisas que acontecem:

1) Criação do URL 2) Tratamento de erros 3) E embora não explícita, a chamada real.

A criação da URL deve ser manuseado por uma classe auxiliar dedicado. É provável que melhor ter o controlo efectuado no controlador, o código de verificação real residiria em outro lugar. O tratamento de erros deve ser no controlador, como ele teria que fazer especial qualquer coisa necessária para o lugar específico que o usuário está. Por último, a própria chamada, deve naturalmente ter lugar no controlador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top