7

これを行う方法が見つからない可能性があります。CodeIgniter複数のコントローラを拡張しますか?

私のコントローラの中には、AdminLayoutが拡張されているものもあれば、ModLayoutが拡張されているものもありますが、これらのページもLoggedIn Controllerを拡張するために必要です。

class Profile extends AdminLayout, LoggedIn { 

しかし、これをうまくやり遂げる方法はありません。回避策はありますか?

+0

少なくともあなた 'LoggedIn'機能は、サービス層ではなく、コントローラ層に配置する必要があります。 – Flavius

答えて

2

PHPは多重継承をサポートしていません。 これにはCodeigniterヘルパーまたはライブラリを使用できます。

は、ライブラリの例を見てください:

http://codeigniter.com/wiki/Simplelogin

25

をあなたはCodeIgniterの2を使用している、これは同じファイル内のすべてのあなたの拡張コントローラクラスを置くことによって行うことができると仮定すると。 /アプリケーションで

/コアMY_Controller.phpというファイルを作成し、ここでは

(ライン109の周りconfig.phpのにサブクラスのプレフィックスをチェックすることを忘れないでください)あなたはすべて追加することができますあなたはコントローラークラスを拡張します。例えば;

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 
/** 
* MY_Controller Class 
* 
* 
* @package Project Name 
* @subpackage Controllers 
*/ 
class MY_Controller extends CI_Controller { 

    public function __construct() { 
     parent::__construct(); 
     $this->form_validation->set_error_delimiters('<div class="form-error">', '</div>'); 
    } 
} 

class LoggedIn extends MY_Controller { 

    public function __construct() { 
     parent::__construct(); 
     if (is_logged_in() == FALSE) { 
      $this->session->set_userdata('return_to', uri_string()); 
      $this->session->set_flashdata('message', 'You need to log in.'); 
      redirect('/home'); 
     } 
    } 
} 

class AdminLayout extends LoggedIn { 

    public function __construct() { 
     parent::__construct(); 
     // do something 
    } 
} 

class ModLayout extends LoggedIn { 

    public function __construct() { 
     parent::__construct(); 
     // do something 
    } 
} 

/* End of file */ 
/* Location: ./application/core/ */ 

通常のようにコントローラを作成する場合、拡張するベースコントローラクラスを選択するだけです。例。

class Foo extends AdminLayout { 

    public function __construct() { 
     parent::__construct(); 
     if (is_logged_in() == FALSE) { 
      $this->session->set_userdata('return_to', uri_string()); 
      $this->session->set_flashdata('message', 'You need to log in.'); 
      redirect('/home'); 
     } 
    } 
} 

または

class Bar extends ModLayout { 

    public function __construct() { 
     parent::__construct(); 
     if (is_logged_in() == FALSE) { 
      $this->session->set_userdata('return_to', uri_string()); 
      $this->session->set_flashdata('message', 'You need to log in.'); 
      redirect('/home'); 
     } 
    } 
} 
関連する問題