2010-12-29 7 views
0

Je veux séparer certaines fonctions des méthodes de contrôleur en bibliothèques pour les rendre modulaires. En fonction de l'URI, j'essaie de router vers une méthode de bibliothèque si elle existe. Mais je dois charger la bibliothèque pour vérifier la méthode avec la fonction php method_exists. Le seul autre moyen que j'ai trouvé pour vérifier cela est de mettre toutes les méthodes de la bibliothèque dans un tableau de configuration et de vérifier le nom de la méthode. Tels que:Codeigniter: Comment puis-je vérifier si une méthode de bibliothèque existe sans charger la bibliothèque?

<?php 
/** 
* Application_config.php 
*/ 

$config['extensions'] = array(
'News' => array(
    'library' => 'articles_library', 
    'methods' => array(
    'articles', 
    'article', 
    'edit_article', 
    'add_article', 
    'delete_article' 
) 
) 
); 

et

<?php 
/** 
* admin_controller.php 
* 
* all admin routes go to index 
*/ 
class C3_base_controller extends Controller { 
public function index() { 
    $lib_chk = 0; 
    $ext = $this->config->item('extensions'); 
    foreach($ext as $item) { 
    foreach ($item['methods'] as $meth) { 
    if ($this->uri->segment(2) == $meth) { 
    $lib = $item['library']; 
    echo $this->$lib->$meth(); 
    $lib_chk = 1; 
    } 
    } 
    } 
    if ($lib_chk == 0) { 
    // rest of controller... 
    } 
} 
} 

Y at-il une meilleure façon de vérifier l'existence d'une méthode de bibliothèque dans chaque bibliothèque sans charger les bibliothèques? Avoir à dupliquer toutes les méthodes dans la configuration de l'application, c'est juste le demander.

+0

Avez-vous envisagé de nommer toutes vos méthodes crud en utilisant une convention de nommage standard? Au lieu de add_article vous utiliseriez add. De cette façon, tous vos modules auraient un nom commun pour les mêmes fonctions et vous n'auriez pas besoin d'un tableau individuel pour chaque module. –

+0

Je ne sais pas pourquoi je n'ai pas pensé à ça. Convention sur la configuration. De cette façon, je pourrais juste vérifier l'un de ces mots, et l'acheminer en fonction du nom de la bibliothèque param. Tels que ** webapp.com/library_name/add ** –

+0

Exactement. C'est ainsi que j'ai mis en place mes propres cms. Tous mes contrôleurs ont une interface commune qui utilise cette convention. Ils ont tous au moins un index, créer, mettre à jour et supprimer la méthode. –

Répondre

0

Êtes-vous en quête de modularité pour le code réutilisable ou créez-vous une application qui a des fonctionnalités qui peuvent ou ne peuvent pas être présentes ... comme dans les plugins?

Il m'est difficile d'imaginer que votre application de base ait des URLs co-chargées qui mènent à une bibliothèque qui n'existe peut-être pas. Pouvez-vous tester pour la bibliothèque plutôt que la méthode? Cela peut être plus simple de vérifier un répertoire et de charger des noms de fichiers dans un tableau, puis de voir si la bibliothèque requise par une url ou un uri se trouve dans ce tableau.

Mais si vous avez besoin de vous en tenir à votre tableau de noms de méthodes existants, pourriez-vous juste regex pour les noms de méthodes après «function (space)» suivi de parenthèses?

+0

créez-vous une application qui a des caractéristiques qui peuvent ou ne peuvent pas être présentes ... comme dans les plugins? Oui. J'essaye de créer une application avec ses propres plugins. Je pensais ouvrir chaque bibliothèque et gratter les noms de fonctions prendrait encore plus de temps que le chargement de la bibliothèque. J'aime l'idée de tester la bibliothèque plutôt que la méthode. –

+0

Je suis d'accord sur le point de grattage ... et j'aime aussi la suggestion de Cadmus. – kevtrout

1

Vous pouvez utiliser

method_exists 

Par exemple, si vous vérifiez l'objet de base de données si elle est existe

if(method_exists($this->CI->db, 'set')){ 
// code ... 
} 
Questions connexes