2011-08-08 14 views
0

CodeIgniterでコントローラークラスの名前としてIndexを使用しないでください。インデックスコントローラーがあり、そのメソッドが複数回呼び出されています。具体的には、そこにルーティングする必要があるパスを訪れているかどうかにかかわらず、最初に呼び出されるメソッドindexが表示されます。アプリケーション/コントローラ/ index.phpをCodeIgniterで2つのコントローラメソッドが呼び出されるのはなぜですか?

class Index extends CI_Controller 
{ 
    public function index() 
    { 
     echo "index"; 
    } 
    public function blah() 
    { 
     echo "blah"; 
    } 
} 

私はindex/blahを訪れたとき、私はindexblahが印刷ご覧ください。私がindex/indexにアクセスすると、私はindexindexと表示されます。コントローラの名前を他のもの(Fooなど)に変更しても問題はありません。それは明らかな回避策ですが、なぜ誰にこのことが起こっているのか教えていただけますか?これをCodeIgniterのバグとして報告する必要がありますか?

(注:私はconfigs/routes.phpで設定なしのルートを持っていません。私のindex.phpはCodeIgniterのツリーの外にある)

答えて

2

問題の内容をさらに明確にするために、PHP4ではコンストラクタがClassと同じ名前の関数でした...

例PHP5のバージョンのための今すぐ

class MyClass 
{ 
    public function MyClass() 
    { 
     // as a constructor, this function is called every 
     // time a new "MyClass" object is created 
    } 
} 

class MyClass 
{ 
    public function __construct() 
    { 
     // as a constructor, this function is called every 
     // time a new "MyClass" object is created 
    } 
} 

だから、アドレスその質問に答えるために(2.0.xののとして、今CodeIgniterの、システム要件として保持しています)問題...

CodeIgniterのコントローラクラスの名前としてIndexを使用しないでください。

index()関数がcodeigniterで予約されているため、Indexをコントローラ名として選択しないことをお勧めします。これにより、PHPの設定によって問題が発生する可能性があります。ここで

+0

ありがとう!コントローラーの名前を持つコントローラーにメソッドがあれば、実際にはこれが問題になります。私は[予約名のリスト](http://codeigniter.com/user_guide/general/reserved_names.html)に 'index'も見つけました。 – theazureshadow

2

なぜこれが起こっている誰も私を伝えることができますか?

コントローラがインスタンス化されると、コンストラクタとしてindexが呼び出されます。

Constructors and DestructorsDocs比較:

後方互換性のため、PHP 5は、与えられたクラスの__construct()関数を見つけることができない場合、それはクラスの名前で、古いスタイルのコンストラクタ関数のためを検索しますindex:あなたのケースでは

を[私が強調し]あなたのコントローラがどの__construct()機能が、クラスと同じ名前を持つ関数を持っていません。 CodeigniterはあなたのIndexコントローラを解決してロードし、次にインスタンス化します。

あなたは自分のコントローラにコンストラクタを追加することによってこの問題を解決することができます

class Index extends CI_Controller 
{ 
    public function __construct() {} 
    public function index() 
    { 
     echo "index"; 
    } 
    public function blah() 
    { 
     echo "blah"; 
    } 
} 

この変更の後、それが再び起こることはありません。

私はこれをCodeIgniterのバグとして報告する必要がありますか?

いいえ、これはバグとして報告する必要はありません。言語がどのように動作するのか、CodeigniterはPHP 4をサポートしているため、PHP 4のコンストラクタを提供する必要があります。 (注:Codeigniterプロジェクトのドキュメントでは、PHPバージョン5.1.6以降のサーバーサポートが必要ですが、実際のコードにはPHP 4互換性があります。

+1

感謝をインデックスを使用している場合は特に、デフォルトのアクションとして指数()を使用することはありません。完全性のために、コンストラクタにparent :: __ construct()を追加します。 – theazureshadow

0

はCodeigniter3

require_once 'Base.php'; 
     class Index extends Base 
    { 
     public function __construct() 
     { 
     parent::index(); 
     $classname=$this->router->fetch_class(); 
    $actioname=$this->router->fetch_method(); 

    if($actioname=='index' || $actioname == '') 
    { 
     $this->viewall(); 
    } 
} 
} 

とviewallを()を使用して、別の解決策は、ベースコントローラは、なぜそれでアプリケーション全体のすべてのライブラリとヘルパーロードを行い、次の

$this->siteinfo['site_title'].=' | Welcome'; 
$this->load->view('templates/header', $this->siteinfo); 
$this->load->view('templates/menu', $this->siteinfo); 
$this->load->view('index/viewall', $data); 
$this->load->view('templates/footer', $this->siteinfo); 

を持っていたありますデフォルトクラスで要求されています

基本的には、CodeIgniterについての私の短い理解から、インデックスとしてデフォルトのアクションを持つことは間違っています。私はこれを$ this-> router-> fetch_method()の結果を使って調べました。私のインデックスクラスのconstruct()内にあります。 CodeIgniterによるデフォルトのアクションはindexですが、デフォルトのコントローラではなく、application/config/routes.php内でデフォルトコントローラを設定することができます。

だから私のアドバイスは、デフォルトのコントローラとして答えを

関連する問題