2010-12-29 16 views
0

Ich möchte bestimmte Funktionen von Controller-Methoden in Bibliotheken trennen, um sie modular zu machen. Basierend auf dem URI versuche ich, zu einer Bibliotheksmethode zu routen, wenn sie existiert. Aber ich müsste die Bibliothek laden, um nach der Methode mit der Funktion method_exists zu suchen. Die einzige andere Möglichkeit, nach der ich gesucht habe, ist, alle Bibliotheksmethoden in ein Konfigurationsarray zu stellen und dort nach dem Methodennamen zu suchen. Wie zum Beispiel:Codeigniter: Wie kann ich prüfen, ob eine Bibliotheksmethode existiert, ohne die Bibliothek zu laden?

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

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

und

<?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... 
    } 
} 
} 

die Bibliotheken in jeder Bibliothek für die Existenz einer Bibliothek Methode zu überprüfen, ohne den Laden eine bessere Weise gibt es? Um jede Methode in der Anwendungskonfiguration zu duplizieren, wird nur danach gefragt.

+0

Haben Sie darüber nachgedacht, alle Ihre crud Methoden zu benennen? Anstelle von add_article würden Sie add verwenden. Auf diese Weise würden alle Ihre Module einen gemeinsamen Namen für die gleichen Funktionen haben und Sie müssten nicht für jedes Modul ein eigenes Array haben. –

+0

Ich weiß nicht, warum ich nicht daran gedacht habe. Konvention über Konfiguration. Auf diese Weise konnte ich einfach nach einem dieser Wörter suchen und es basierend auf dem Bibliotheksnamen param weiterleiten. Wie zB ** webapp.com/library_name/add ** –

+0

Genau. So habe ich mein eigenes cms implementiert. Alle meine Controller haben eine gemeinsame Schnittstelle, die diese Konvention verwenden. Sie alle haben mindestens einen Index, erstellen, aktualisieren und löschen Sie die Methode. –

Antwort

0

Verfolgen Sie Modularität für wiederverwendbaren Code oder erstellen Sie eine Anwendung mit Funktionen, die vorhanden sein können oder nicht ... wie in Plugins?

Es ist schwer für mich, sich vorzustellen, dass Ihre Basisanwendung über hartcodierte URLs verfügt, die zu einer Bibliothek führen, die möglicherweise nicht existiert. Können Sie lieber die Bibliothek als die Methode testen? Das kann einfacher sein, ein Verzeichnis zu überprüfen und Dateinamen in ein Array zu laden, und dann sehen, ob die von einer URL oder URI benötigte Bibliothek in diesem Array ist.

Aber wenn Sie an Ihrem Array von bestehenden Methodennamen bleiben müssen, könnten Sie einfach für die Methodennamen regex, die nach "function (space)" auftreten und gefolgt von Klammern? mit einer Standard-Namenskonvention

+0

erstellen Sie eine Anwendung mit Funktionen, die vorhanden sein können oder nicht ... wie in Plugins? Ja. Ich versuche eine Anwendung mit eigenen Plugins zu erstellen. Ich dachte, jede Bibliothek öffnen und scraping die Funktionsnamen würde noch mehr Zeit als nur das Laden der Bibliothek. Mir gefällt die Idee, die Bibliothek zu testen, und nicht die Methode. –

+0

Ich stimme dem Kratzpunkt zu ... und ich mag Cadmos Vorschlag auch. – kevtrout

1

können Sie

method_exists 

Zum Beispiel verwenden, wenn Sie für das Datenbankobjekt werden zu überprüfen, ob es vorhanden ist

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