2009-03-04 7 views
0

J'écris une application en utilisant CakePHP et je ne sais pas où je devrais mettre ma fonction generateMapUrl.Où dois-je mettre cette méthode sur un site piloté par CakePHP?

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

J'ai la structure suivante:

Réservation (Modèle & Controller)
Propriétés (Modèle & Controller)
Adresse (modèle & Controller)

A Réservation hasOne Propriété et propriété ty hasOne Adresse. Je voudrais être en mesure d'appeler generateMapUrl pour n'importe quelle adresse. Je ne suis pas sûr de l'endroit où mettre la méthode si ... Adresse contrôleur? Modèle d'adresse? (Remarque: j'appelle cette méthode du contrôleur Bookings)

Répondre

0

La méthode generateMapUrl() doit être une méthode dans votre modèle d'adresse car il traite des données de fetching et la mise en forme d'adresse, mais doit retourner faux et ne pas contenir les appels de session:

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

Vous pouvez ensuite appeler ceci à partir de n'importe quel contrôleur et utiliser les appels de session là:

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

Bonne réponse, cela me semble le plus logique car je ne fais que formater les données d'adresse. Il vaut la peine de noter qu'il doit s'agir de données ['Address'] ['street'] plutôt que de données ['street'] mais c'était de ma faute pour commencer. Merci pour votre réponse! – Shane

3

Dans le contrôleur, il contient des données de session. Le modèle ne doit pas connaître les états de session.

+0

Je suppose que vous faites référence au contrôleur d'adresse? – Shane

+0

Ce fut ma première pensée, merci pour la confirmation :) – Shane

0

Je pourrais envisager de créer une classe AddressMapUrlGenerator et de l'utiliser pour créer l'URL. Vous pouvez lui transmettre une adresse. De cette façon, vous n'embrouillerez pas le Modèle avec des soucis d'URL ou de cartes, et vous n'aurez plus de soucis à l'avenir d'avoir la même fonction étalée dans plus d'un Contrôleur.

+0

Peut-être vous recommandons également de créer une classe de base abstraite appelée UrlGenerator? –

+0

Peut-être, mais cela dépend vraiment du domaine métier de l'application. Plus important, les objets du domaine central devraient probablement avoir des responsabilités plus bien décomposées. Si ce n'est pas une partie importante du système, alors vous ne devriez probablement pas y consacrer autant de temps. – RibaldEddie

+0

Je peux être d'accord avec ça. –

0

Dans le modèle, créez une classe GoogleAddress. Utilisez ensuite GoogleAddress dans le contrôleur.

-1

À tout le moins, il y a trois choses qui se passent:

1) Création de l'URL 2) Gestion des erreurs 3) Et bien que pas explicite, l'appel réel.

La création de l'URL doit être gérée par une classe d'assistance dédiée. Il est préférable que la vérification soit effectuée sur le contrôleur, le code de vérification réel devrait se trouver ailleurs. La gestion des erreurs devrait être sur le contrôleur, car il devrait faire quelque chose de spécial requis pour l'endroit spécifique à l'utilisateur. Enfin, l'appel lui-même devrait bien sûr avoir lieu sur le contrôleur.

Questions connexes