コードイグナイターコントローラークラスを拡張するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1626305

  •  06-07-2019
  •  | 
  •  

質問

CI system \ librariesディレクトリに、DD_Controller.phpという名前の新しいクラスがあります。このファイルは次のようになります。

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

class DD_Controller extends Controller 
{   
    protected $ddauthentication;


    function __construct()
    {           
        parent::Controller();
        $this->ddauthentication = "Authenticated";
    }
}
?>

アプリケーションコントローラーは次のように定義されています:

class Inquiry extends DD_Controller 
{...}

Controllerを拡張するとInquiryクラスは正常に機能しますが、

  

致命的なエラー:クラス 'DD_Controller'ではありません   で発見   C:\ development \ localhost \ applications \ inquiry \ controllers \ inquiry.php   4行目

DD_Controllerを拡張するとき。構成ファイルには、次のように定義されたプレフィックスがあります。

$config['subclass_prefix'] = 'DD_';

私が見逃しているものについて何か考えがありますか?

TIA

役に立ちましたか?

解決

DD_Controller.phpは/ system / application / libraries /にある必要があります

複数のアプリに同じCIを使用しており、すべてのアプリでコントローラーをカスタムアプリに拡張できるようにする場合は、同じファイルのベースコントローラークラスを拡張できます。

system / libraries / Controller.phpのControllerクラスの下:

class Mega_Controller extends Controller {
    function Mega_Controller()
    {
        parent::Controller();
        // anything you want to do in every controller, ye shall perform here.
    }
}

その後、アプリコントローラーでこれを行うことができます。

class Home extends Mega_Controller {
    ....

作成した拡張コントローラクラスが利用可能になるため。これはベースコントローラーを上書きするよりも良いと思いますが、それでも同様に機能します。

他のヒント

これはより良いアプローチです。次の手順を実行します。

  1. 次のディレクトリに移動します: your_ci_app / application / core / および MY_Controller.php というphpファイルを作成します(このファイルは最上位の親クラスが置かれる場所になります) )
  2. 作成したばかりのファイルを開き、複数のクラスを追加します。

    class Admin_Parent extends CI_Controller {
        public function __construct() {
            parent::__construct();
        }
    
        public function test() {
            var_dump("from Admin_Parent");
        }
    }
    
    class User_Parent extends CI_Controller {
    
        public function __construct() {
            parent::__construct();
        }
    
        public function test(){
            var_dump("from User_Parent");
        }
    
    }
    
  3. このディレクトリ your_ci_app / application / controllers / の下に子コントローラを作成します。 adminchild.php

  4. と呼びます
  5. adminchild.php を開き、コントローラーコードを作成します。次のように、必ず親クラスの名前を拡張してください。

    class Adminchild extends Admin_Parent {
    
        function __construct() {
            parent::__construct();
        }
    
        function test() {
            parent::test();
        }
    
    }
    

「割れ」を避けることをお勧めします。 CodeIgniterコアファイル。 ネイティブ拡張の可能性をより有効に活用し、それらに適合するようにしてください。

PHPライブラリ/ CMSに対して推奨するのと同じルール。 このルールにはいくつかの理由があります。 -コアファイル内のどこでどのようにクラックされたかを数千のメモに変換することなく、迅速にアップグレードする機能。 -移植性; -あなたのコードを共有する可能性-例えば、これはあなたとあなたの友人の両方が必要に応じて使用でき、あなたと同じように彼らのライブラリを最新に保つのに役立ちます。

言い換えれば、これははるかに専門的であり、使いやすさ、移植性、および更新アプリケーションの可能性によって将来的にあなたに支払います。

個人的な質問について...

私にとっては、ネイティブCodeIgniter Controllerを拡張するために必要なものをすべて備えた独自のライブラリを作成し、このライブラリをControllerのコンストラクターにロードして完了です。使いやすさを高める唯一の方法は、ライブラリに短い名前を付けることです。

この方法では、必要なものをさまざまな部分に分割し、個別のライブラリに入れることもできます。 WebFeatures AdminFeatures など。

その後、コントローラーのコンストラクターに必要なライブラリをロードするだけで完了です。

PS提案された方法が「正しい」に適合しないことを知っています。 OOPの概念ですが、同時に使用するライブラリの整合性を決して忘れないでください。

上記はすべて、プロのWeb開発における私の7年の経験のもう1つの見方です。したがって、従わない場合、少なくとも考慮に入れることが役立つと思います。

よろしく、 アントン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top