2012-08-15 7 views
6

ich diesen Fehler Controller in meiner Codeigniter 2.1.0 Anwendung haben:kann nicht die gleiche statische Methode aus identischen Verfahren aus der gleichen Klasse nennen

<?php 

class Error extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function index() 
    { 
     set_status_header(404); 
     $data->menuItems = Main::_menu(); 
     $data->title = "404 error !"; 
     $data->pageview = 'templates/404'; 
     $this->load->view('templates/main', $data); 
    } 

    public function facebook() 
    { 

     set_status_header(404);    
     $data->menuItems = Main::_menu(); 
     $data->title = "Facebook error !"; 
     $data->pageview = "templates/facebook_error"; 
     $this->load->view('templates/main', $data); 
    } 
} 
?> 

Die Maincontroller _menu:

<?php 
class Main extends CI_Controller 
{ 
    // ... a lot of methods here ... 
    public static function _menu() 
    { 
      static $menuItems = array(//just a simple array 
            ); 
    } 
} 
?> 

facebook() Methode ist völlig das gleiche wie der Index(), aber index funktioniert gut, facebook() werfen diese Nachricht:

Wie ist das möglich? Wie erreiche ich Main::_menu() von facebook() Methode?

+1

Ist die MainController-Datei enthalten? Der Fehler bedeutet, dass die Klasse nicht gefunden werden kann, da die Klassendatei nicht im Skript enthalten ist. – DavidS

+0

Dies ist die gesamte Fehlerklasse. In der index() -Methode ist kein zusätzlicher Code enthalten. Wie ist das möglich, wenn diese beiden gleich sind, aber man nicht das nennen kann, was der andere kann? Oder ist die index() -Methode eine spezielle? und ja, ich weiß, wie man etwas einbezieht, aber meine Frage ist, wie ist es möglich, dass index() funktioniert ??? – kissgyorgy

+0

Wo ist die 'Main' Klasse? – PeeHaa

Antwort

1

Basierend auf der Antwort von @ TheShiftExchange konnte ich feststellen, dass eine Routeneinstellung dieses Verhalten verursacht hat. Mein config/routes.php sieht wie folgt aus:

$route['404_override'] = 'error/index'; 
$route['(:any)'] = "main/$1"; 

Also, wenn ich eine Anfrage an www.example.com/nonexistent-url dies durch die main Controller bedient wurden gemacht, dann CI bemerkt, dass es keine Methode, wie dieser ist so lief es error/index auch, aber die main Controller war bis dahin schon geladen.

Die andere Methode facebook wurde nur aus einem bestehenden Verfahren von main umgeleitet, zum Beispiel gallery, so wie es ist, wenn ich auf die URL ging www.example.com/error/facebook, so dass die main Controller nicht geladen wird, weil nur error/facebook angefordert wird. Wenn ich www.example.com/error/index rufe funktioniert es gleich, denn in diesem Fall ist der main Controller nicht geladen, nur der error.

(The Bounty @TheShiftExchange geht, weil seine Antwort war die genaueste und mir die besten Informationen zu Lage, die Spur des Problems. Dank!
Einer meiner Umleitung wurde nie erreicht, was ich gelehrt wurde der Aufruf Fehler-/Indexseite.)

1

Das Aufrufen von Funktionen von einem anderen Controller unterbricht MVC und versetzt Sie in den HMVC-Bereich.

Werfen Sie einen Blick auf this thread, und auch CodeIgniter Modular Extensions (HMVC) Plugin, wenn Sie dies wirklich tun müssen.

+0

Gutes Thema, danke. Ich denke, ich habe Antwort auf meine alte Frage in diesem: http://codereview.stackexchange.com/questions/11277/where-to-put-menu-items-in-mvc-with-php-model-or-controller – kissgyorgy

1

Warum erstellen Sie nicht MY_Controller, der den CI_Controller erweitert, wo Sie Ihren wiederverwendbaren Code platzieren?

1

Eigentlich - Sie irren sich. Ihr "Index" -Code funktioniert auch nicht.

Ich habe gerade den gesamten obigen Code in eine saubere Version von CI 2.1.2 eingefügt und die Indexfunktion ALSO gibt denselben Fehler zurück.

Vielleicht hat Ihr Computer etwas zwischengespeichert, oder Sie haben einen anderen Code wo Sie denken, dass es funktioniert. Aber es funktioniert nicht.

Wie auch immer - die echte Frage ist, warum versuchen Sie, einen Controller von einem anderen Controller aufzurufen? Das ist kein guter MVC-Ansatz. Ihre Funktion "_menu()" sollte sich in einer library - das ist, wo es hingehört.

Oder setzen Sie den _menu() Code in "MY_Controller" und beide Controller erweitern MY_Controller.

Oder setzen Sie den _menu() Code in eine helper.

Grundsätzlich gibt es drei bessere Möglichkeiten, wie Sie das erreichen könnten.

+0

Beste Antwort bis jetzt, ich überprüfe es, vielleicht Caching war der Grund ... Auch danke für die Vorschläge, ich habe bereits Menü in einem Modell. – kissgyorgy

Verwandte Themen