私はこれが私の最初のCIプロジェクトであり、ログインシステム(3つのユーザーグループ= admin、member、public)を構築しようとしています。IonAuthを使用しています。
詳細をスキップしたい場合..
..私の問題は、ホームコントローラーで「require_once」を正しく実行していないか、クラスの拡張について何かを理解していないことです。または、私は母が私に言っているほど賢くはありません。このエラーが発生します:
Fatal error: require_once() [function.require]: Failed opening required 'application/Application/Core/public_controller.php' (include_path='.:/Applications/MAMP/bin/php/php5.3.6/lib/php') in /Applications/MAMP/htdocs/NOIR_FINAL/application/controllers/public/home.php on line 4
良い習慣のように見えるので、私はこの記事を参照しました。具体的には、CI_ControllerをMY_Controller(すべてCI_Controllerを拡張したAdmin、Member、およびPublicコントローラーを含む)で拡張しました。
http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth
次に、これら3つの管理者、メンバー、およびパブリックコントローラーすべてを1つの「MY_Controller」に「パック」するという批判がありました。PhilSturgeonによると、これらを個別のクラスに分割し、__ autoload()を使用してそれらをプルしようとしました。
http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY
しかし、どういうわけか、私は今、物事を不必要に複雑にしているだけだと感じています。
ログインを実行し、ユーザーグループに応じて、専用フォルダー内の3つの「ホーム」コントローラーのいずれかに送信します。これらのホームコントローラーはAdmin_controller、Member_controller、またはPublic_controllerを拡張します...そしてそれらのそれぞれがMY_Controllerを拡張し、MY_ControllerはCI_Controllerを拡張します。したがって、それぞれのコントローラーにグループ固有のメソッドがあり、MY_Controllerにいくつかの一般的なものがあります(サイトがライブ/「オープン」であるかどうかを確認する..ユーザーエージェントを確認するなど)。これは、私には、ユーザーの役割を分離するための非常に優れた方法のようです。
チョウザメの記事によると、私もこれを私の設定に持っています..
function __autoload($class)
{
if(strpos($class, 'CI_') !== 0)
{
@include_once( APPPATH . 'core/'. $class . EXT );
}
}
だから私はこれを正しい方法で行っているのでしょうか?これを初めて試したので、これは少し「フランケンシュタイン」になりすぎていると思い始めています。これが「auth/login」です...
function login() {
if($_POST) { //clean public facing app input
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
$this->form_validation->set_rules('password', 'Password', 'required');
if ($this->form_validation->run() == true)
{
$identity = $this->input->post('email', true);
$password = $this->input->post('password', true);
$remember = $this->input->post('remember');
if($this->ion_auth->login($identity,$password, $remember))
{
if($this->ion_auth->in_group('1'))
{
$this->session->set_flashdata('message','Welcome');
redirect('admin/home','refresh'); // this might have to change @todo
}
elseif($this->ion_auth->in_group('2'))
{
$this->session->set_flashdata('message','Welcome');
redirect('member/home','refresh');
}
else
{
redirect('public/home','refresh');
}
}
}
else
{
// set error flashdata
$this->session->set_flashdata('message','Your login attempt failed.');
redirect('/');
}
}
redirect('/');
}
..そしてここに"controllers/ member /"のhome.phpがあります..基本的にはビューを設定し、flashdataメッセージ(もしあれば)を$data{'message']に変換するだけです。
class Home extends Member_Controller{
require_once(APPPATH.'Application/Core/member_controller.php');
public function __construct()
{
parent::__construct;
}
public function index()
{
// remember that $this->the_user is available in this controller
// as is $the_user available in any view I load
$this->load->model('Member_model');
$this->data['message'] = $this->session->flashdata('message');
$this->data['query'] = $this->Member_model->get_members();
$this->data['title'] = 'Home';
$this->load->view('member_view', $this->data);
}
}
これがいくつかのメンバーメソッドを持つ私のメンバーコントローラーです
class Member_Controller extends MY_Controller{
public function __construct()
{
parent::__construct();
}
public function index()
{
$this->load->view('member_view');
}
public function edit_profile(){}
public function delete_profile(){}
}
..およびMY_Controllerといくつかの一般的なメソッド
class MY_Controller extends CI_Controller {
protected $the_user;
public function __construct()
{
parent::__construct();
if( $this->config->item('site_open' ) === FALSE)
{
show_error("Sorry the site is shut right now.");
}
if( $this->ion_auth->logged_in() )
{
$this->the_user = $this->ion_auth->user()->row();
$data->the_user = $this->the_user;
$this->load->vars($data);
}
else
{
redirect('/','refresh');
}
//if the user is using a mobile, use a mobile theme
$this->load->library('user_agent');
if( $this->agent->is_mobile() )
{
$this->template->set_theme('mobile'); // what about admin @todo
}
}
public function index()
{
redirect('/','refresh');
}
}
だから私はこれに正しく近づいていますか?ボーナスの質問として、これから拡張されるだけのクラスにインデックスメソッドを配置するのは正しいですか?たとえば、MY_Controllerに「着陸」する人は誰もいません。常に延長されます。では、インデックスメソッドを配置する必要がありますか?いい形ですか?これを抽象クラスにする必要がありますか?