2010-12-02 46 views
3

Trips hasMany Legs hasMany SegmentsOù devrait fonctionner une certaine fonction go-model ou controller? CakePHP

Dans mon application de recherche de vols, j'ai une fonction qui retourne des Leg.destination (s) uniques. Cette fonction est pour une méthode de contrôleur de déclenchement. Est-ce que je mets la fonction dans le modèle de voyage ou de jambe? Si dans le modèle de jambe je l'appelle avec $ this-> Trip-> Leg-> findUniqueDests .....? Je demande parce que je veux coller à la convention de CakePHP. Merci!

//code that finds ALL destinations for each Leg 
$destinations=$this->Trip->Leg->find('all', array('limit'=>100,'fields'=>'Leg.destination')); 

//code that finds the unique destinations (to be used to search all flights for a particular city 
function findUniqueDests($destinations){ 
    $unique_destinations = array(); 
    foreach ($destinations as $dest) 
    { 
     if(!in_array($dest, $unique_destinations)) 
     { 
      $unique_destinations[] = $dest; 
      sort($unique_destinations); 
     } 
    } 
    return $unique_destinations; 

}

+0

plusieurs pattes, de nombreux segments par patte, des vols ... Votre application contrôle-t-elle les centipèdes volants? : P Je pense que c'est le mieux dans le modèle. – FrustratedWithFormsDesigner

+0

Nous tirons toutes les données que Kayak fournit pour le moment. Convenu que certains pourraient être excessifs. – JohnAllen

+0

Fat Model Skinny Controller, ça m'aide souvent à garder mon code en échec :) – serialk

Répondre

3

Oui, vous mettre dans le modèle Leg. Cela vous permettra d'appeler la méthode de tout autre modèle connexe:

// Trip Controller 
$this->Trip->Leg->findUniqueDests($destinations); 

// Leg Controller 
$this->Leg->findUniqueDests($destinations); 

// Segment Controller 
$this->Segment->Leg->findUniqueDests($destinations); 

Kudos à vous pour savoir qu'il devrait être dans un modèle. Beaucoup de gens commençant par CakePHP entassent toutes leurs méthodes dans les contrôleurs. Le fait de le faire dans le Modèle de cette façon vous permet de réutiliser le code partout dans l'application. En réalité, ce type de fonction d'utilité pourrait être placé dans n'importe quel modèle. Mais puisqu'il s'agit de Legs, la maison la plus logique serait le modèle Leg. Question: Pourquoi trier chaque fois qu'une destination est ajoutée à la baie? Ce serait plus optimisé:

function findUniqueDests($destinations) { 
    $unique_destinations = array(); 
    foreach ($destinations as $dest) { 
     if(!in_array($dest, $unique_destinations)) { 
      $unique_destinations[] = $dest; 
     } 
    } 
    return sort($unique_destinations); 
} 
+0

Vous avez raison! Merci. J'ai emprunté la plupart de cette fonction donc je n'y avais pas vraiment réfléchi/je l'ai utilisé. – JohnAllen