Question

J'écris une application avec CakePHP et je ne sais pas où je devrais mettre ma fonction 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;
}

J'ai la structure suivante:

  

Réservation (modèle et contrôleur)
  Propriétés (modèle et contrôleur)
  Adresse (modèle et contrôleur)

Une propriété de réservation hasOne et une adresse de propriété hasOne . J'aimerais pouvoir appeler generateMapUrl pour n'importe quelle adresse. Je ne sais pas où mettre la méthode si ... Contrôleur d'adresse? Modèle d'adresse? (Remarque: j'appelle cette méthode à partir du contrôleur Bookings.)

Était-ce utile?

La solution

La méthode generateMapUrl () doit être une méthode de votre modèle d’adresse car elle traite de la récupération et du formatage des données d’adresse, mais elle doit retourner false 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 cela depuis n'importe quel contrôleur et utiliser les appels de session à cet emplacement:

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

Autres conseils

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

Je pourrais envisager de créer une classe AddressMapUrlGenerator et de l’utiliser pour créer l’URL. Vous pouvez lui passer une adresse. De cette façon, vous ne serez pas embrouillé dans le modèle par des soucis concernant les urls ou les cartes, et vous ne craindrez plus que la même fonction soit répartie dans plusieurs contrôleurs.

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

Au moins, il se passe trois choses:

1) Création de l'URL 2) Traitement des erreurs 3) Et bien que ce ne soit 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 de faire effectuer la vérification sur le contrôleur, le code de vérification réel résidant ailleurs. Le traitement des erreurs doit se faire sur le contrôleur, car il devra faire tout ce qui est spécial requis pour l'endroit spécifique où se trouve l'utilisateur. Enfin, l’appel lui-même devrait bien sûr avoir lieu sur le contrôleur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top