2

私がやろうとしているのは、かなり単純なことだけです:

  • CI_Controller を拡張するクラス (たとえばbrandNewClass- NOT ) を作成します。MY_Controller
  • 拡張する他のコントローラーを作成するbrandNewClass

例えば

class brandNewClass extends CI_Controller {

    public function index()
    {

    }

    public function info()
    {

    }
}

のように使用されます ( の下のファイル内/controllers) :

<?php

class newController extends brandNewClass
{
}

?>

問題は、ファイルを下にコピーして/application/core名前を付けたMY_Controllerときに機能しますが、名前をもっと何かに変更すると... 自明ですが、機能しません。

致命的なエラー: クラス 'brandNewClass' が .... 行 .. に見つかりません

here__autoloadで言及されている機能を使用してみましたが、運がありませんでした。

何か案は?

4

5 に答える 5

8

この優れたチュートリアルをご覧ください - お役に立てば幸いです

http://codeigniter.tv/a-10/Extending-the-core-MY_Controller-and-beyond

于 2012-07-30T07:52:01.140 に答える
8

オートローダーは、他のコントローラーを自動的に組み込みません。次のように手動で含める必要があります。

if (!defined('BASEPATH'))exit('No direct script access allowed');

    include_once(APPPATH . 'controllers/brandnewclass.php');
于 2012-07-29T17:06:14.337 に答える
3

カスタム ベース コントローラーを作成し、そこに他のコントローラーを拡張する場合は、次の方法で実行できます。

  1. MY_Controllerフォルダーに拡張CI_Controllerを作成し、コアから自動ロードされるapplication/core/ように他のコントローラーを拡張MY_Controllerします(これはすでに知っていると思いますが、他の代替手段が必要です。MY_Controller

  2. で作成MY_Controllerapplication/core/ます。Admin_Controller次に、主にとである別のレベルのコントローラーを作成しますFrontend_Controller。これで、これらのコントローラーの 1 つが、実際に使用するコントローラーのベースになります。

例えばapplication/core/MY_Controller.php

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

次に、管理者およびフロントエンドコントローラーが作成され、次のようapplication/libraries/に拡張されますMY_Controller

class Admin_Controller extends MY_Controller {
    public function __construct(){
        parent::__construct();
    }
}

現在、任意のコントローラーでこれら 2 つのコントローラーのいずれかを拡張できますが、そのためにはそれらを自動ロードする必要があります。この場合のオートロードでは、config/autoload.php で autoload['libraries'] を設定しても機能しないため、混乱が生じる可能性があります。そのオートロードはコントローラー内で機能しますが、ここではその前に、つまりクラス宣言でオートロードする必要があります。このコードを設定する必要がありますconfig/config.php

function __autoload($class) 
{
  $path = array('libraries');

  if(strpos($class, 'CI_') !== 0) {
    foreach($path as $dir) {
        $file = APPPATH.$dir.'/'.strtolower($class).'.php';
        if (file_exists($file) && is_file($file))
            @include_once($file);
    }
  }
}

これで、独自のコントローラーを作成できます

class newController extends Admin_Controller
{
}

これは、構造を非常にクリーンで効果的なものにする最も推奨される方法です。初めて理解するのに多少の努力が必要かもしれませんが、間違いなく価値があります。

  1. 3番目の方法は、2番目の方法を微調整したものであり、使用しないという条件に基づいています直接MY_Controller 作成Admin_ControllerまたはFrontend_Controller拡張できますが、拡張することはできません 。その場合、これらのコントローラーの両方でコードの重複が発生する可能性がありますCI_ControllerMY_Controller
于 2014-05-23T07:38:14.237 に答える
2

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-base-Classes-Keeping-it-DRY 私はあなたが似たようなことをしようとしていると思いますか? 常にクラスを require_once() する必要がないように、構成ファイルに追加できる autoload 関数があります。

于 2012-07-29T19:21:03.143 に答える
1
  1. クラスは直接インスタンス化してはならないため、クラスを抽象として宣言する必要があります。
  2. CodeIgniter オートローダー構成ファイルを変更してそれにクラスを追加するか、実際のオートローダーを変更する必要があります。
  3. CodeIgniter を使用しないことを検討する必要があります :)
于 2012-07-29T17:05:12.973 に答える