2009-02-04 9 views
2

Au lieu d'utiliser $this->fetchAll('email = ?',$email)->current() à l'intérieur de la classe de modèle, est-il un moyen de faire $this->fetchByEmail($email) ou $this->findByEmail($email)?Zend Framework findBy méthode magique?

Il y a déjà une méthode magique comme celui-ci pour Zend_Log, où au lieu de $myLogger->log("Something went wrong",Zend_Log::CRIT) vous écrivez juste $myLogger->crit("Something went wrong") et il devient automagiquement cartographiées (via une réflexion géniale dans la méthode __call()).

Est-ce que quelqu'un sait s'il y a quelque chose comme ça dans l'une des classes Zend_Db, ou vais-je devoir écrire quelque chose pour le faire pour moi?

Répondre

5

Pour la fonctionnalité particulière que vous souhaitez, vous devez créer une fonction personnalisée. Honnêtement, la logique derrière la fonction magique __call() n'est pas si difficile.

Quelque chose comme ça devrait faire l'affaire:

public function __call($function, $args) 
{ 
    // Expects findBy to be the first part of the function 
    $criteria = substr($function, 6); 
    $criteria = strtolower($criteria); 

    $select = $this->select() 
       ->from($this->_name) 
       ->where($criteria . ' = ?', $args); 
} 

Il est évident que si vous voulez gérer les cas plus complexes, comme des tableaux ou plusieurs paramètres de critères, vous devez mettre en œuvre le contrôle mieux mais cela devrait donner l'idée de base .