1

私はこれが私の最初の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に「着陸」する人は誰もいません。常に延長されます。では、インデックスメソッドを配置する必要がありますか?いい形ですか?これを抽象クラスにする必要がありますか?

4

2 に答える 2

1

require/include を使用する場合は、を指定する必要がありPATH、絶対的または相対的である必要があります。

絶対の:

/my/cool/folder/file.php //which means from the root ("/") of the server

相対的:

./file.php //which means look in the current directory for file.php

また

../file.php //which means go up one directory and look for file.php

aがまたはでPATH定義されていない場合、システムはで定義されているインクルード パスを使用します。requireincludephp.ini

設定したもの:require_once('application/Application/Core/public_controller.php')相対も絶対も設定していないため機能しません。したがって、システムはで設定されているPATHを探しています。public_controller.phpinclude_pathphp.ini

これらすべてと、そもそもパブリック コントローラーを含める理由についてはまだ説明していません。

クラスを拡張すると、既存のクラスの補助として使用できるようになります。このように、 を拡張する場合CI_ControllerCI_Controllerはアプリケーションで既に使用可能であるため、ファイルをインクルードする必要なく、拡張された機能も使用できます。

indexいいえ、 でメソッドを作成する必要はありませんMY_Controller

最後に、これをすべて行う必要があるかどうかはわかりません...コアクラスの拡張は、通常、コアに必要な機能や欠落している機能を追加したり、既存の機能をオーバーライドしたりするために予約されています。あなたがやっていることは、コントローラーで問題なく動作するコードをコア アプリケーションに移動することです。うまくいくと思いましたが、ベストプラクティスでも実用的でもないと思います。

于 2012-11-19T18:37:24.863 に答える
1

指定したパスが原因でインクルードが失敗しています。エラー メッセージを確認してください。それはCIがapppathと見なすものであるため、アプリケーションは不要です。

require_once(APPPATH.'core/member_controller.php');

これで解決するはずですが、そのコードを読み直した後、これは必要ないことに気付きました。とにかくそれを含める必要がありますか?拡張コントローラーでそのようなインクルードを行っていないことはわかっています

物事を過度に複雑にすることについて。個人的には、おそらく 1 つの点を除いて、あなたが過度に複雑にしているとは思いません。私たちのアプリケーションには、Admin_Controller、User_Controller、および MY_Controller があります。複雑すぎるかもしれない場所は、Public_Controller を持っていることです。私が見ているように、管理者とユーザーは、アプリケーション自体の基本機能である MY のすべての機能を持っています。つまり、本質的には私のパブリックコントローラーです。

サイトの特定の部分へのアクセスを 1 か所で制限できることは非常に理にかなっており、アプリケーションの全体的な流れもより理にかなっています。私の意見では、ページをロードするたびに、さまざまなシナリオすべてに必要なすべての機能を備えたコントローラーをロードしていないため、オーバーヘッドも少なくなります。

于 2012-11-19T19:14:06.680 に答える