6

Codeigniter 2.1.0 アプリケーションに次のエラー コントローラーがあります。

<?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);
    }
}
?>

メインコントローラ _menu:

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

facebook() メソッドは index() とまったく同じですが、index は問題なく動作し、facebook() は次のメッセージをスローします。

Fatal error: Class 'Main' not found in /var/www/MYApplicationName/application/controllers/error.php on line 22

地球はどのようにそれが可能ですか?Main::_menu()facebook() メソッドからどのようにアクセスできますか?

4

4 に答える 4

1

実は - あなたは間違っています。「インデックス」コードも機能しません。

上記のすべてのコードを CI 2.1.2 のクリーン バージョンに貼り付けたところ、インデックス関数も同じエラーが返されます。

おそらく、あなたのコンピュータには何かがキャッシュされているか、それが機能していると思わせる他のコードがどこかにあるのでしょう。しかし、うまくいきません。

とにかく、本当の問題は、なぜ別のコントローラーからコントローラーを呼び出そうとしているのかということです。それは良い MVC アプローチではありません。「_menu()」関数はライブラリに配置する必要があります-それが属する場所です。

または、_menu() コードを「MY_Controller」に配置し、両方のコントローラーでMY_Controllerを拡張します。

または、 _menu() コードをヘルパーに入れます。

基本的に、これにアプローチできるより良い方法が 3 つあります。

于 2012-08-19T04:37:13.867 に答える
1

@TheShiftExchange の回答に基づいて、ルート設定がこの動作の原因であることを突き止めることができました。私config/routes.phpはこのように見えます:

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

www.example.com/nonexistent-urlそのため、これをコントローラーで処理するように要求したときmain、CI はこのようなメソッドがないことに気付き、それも実行しerror/indexましたが、その時点でmainコントローラーは既に読み込まれていました。

もう 1 つのメソッドfacebookは、既存のメソッド only からリダイレクトされましたmain。たとえばgallery、このように url に移動した場合と同じようにwww.example.com/error/facebookmainコントローラーは読み込まれませんerror/facebook。呼び出しwww.example.com/error/indexても同じように機能します。この場合、mainコントローラーはロードされず、error.

(報奨金は @TheShiftExchange に送られます。彼の回答が最も正確で、問題を追跡するための最良の情報を提供してくれたからです。ありがとうございます。
リダイレクトの 1 つに到達できませんでした。エラー/インデックス ページを呼び出していると思いました。)

于 2012-08-19T08:37:37.523 に答える
1

再利用可能なコードを配置する CI_Controller を拡張する MY_Controller を作成してみませんか?

于 2012-08-18T19:40:37.663 に答える
1

別のコントローラーから関数を呼び出すと、MVC が中断され、HMVC 領域に置かれます。

本当に必要な場合は、このスレッドと CodeIgniter のModular Extensions (HMVC) Pluginを参照してください。

于 2012-08-15T16:49:27.917 に答える