Onde devo colocar esse método no local CakePHP-driven?
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)
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.