0

約1週間前、OOPを学びたいので、CodeIngiterの実験を始めました。私は正しい方向に進んでいると思っていましたが、今ではそれを疑うようになりました。その理由は、メンバー用のコントローラーがあり、かなり大きなファイルになっているからです。これは、URLをmembers / login、members/registerなどのようにしたいためです。

これが私のコントローラーです:

<?php
class Members extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model('users');
    }
    public function index()
    {
    }
    public function register()
    {
        $this->load->helper(array(
            'form',
            'recaptcha'
        ));
        $this->load->library('form_validation');
        $data['title']       = "Register a free account - Become an Author";
        $data['titlesucces'] = "Thanks for registering";
        $this->form_validation->set_rules('fname', 'First name', 'required');
        $this->form_validation->set_rules('lname', 'Last name', 'required');
        $this->form_validation->set_rules('password', 'Password', 'required');
        $this->form_validation->set_rules('passwordconf', 'Password Confirmation', 'required');
        $this->form_validation->set_rules('email', 'Emailaddress', 'required|is_unique[users.email]|valid_email');
        $this->form_validation->set_rules('recaptcha_challenge_field', 'Captcha', 'required|recaptcha_matches');
        if (!$this->form_validation->run()) {
            $this->load->view('header', $data);
            $this->load->view('register', $data);
        } else {
            $this->users->register_new_member();
            $this->load->view('register_succes', $data);
        }
    }
    public function login()
    {
        $data['title'] = "Login";
        $data['fail']  = "";
        $this->load->helper('form');
        $this->load->library('form_validation');
        $this->form_validation->set_rules('email', 'Emailaddres', 'required');
        $this->form_validation->set_rules('password', 'Password', 'required');
        if (!$this->form_validation->run()) {
            $this->load->view('login', $data);
        } else {
            if ($this->users->do_login($this->input->post('email'), $this->input->post('password'))) {
                $this->load->view('login', $data);
            } else {
                $data['fail'] = "Emailaddress or password is incorrect";
                $this->load->view('login', $data);
            }
        }
    }
    public function logout()
    {
        $this->session->sess_destroy();
        redirect('/members/login/', 'refresh');
    }
    public function addarticle()
    {
        if ($this->users->logged_in()) {
            $this->load->helper('form');
            $this->load->library('form_validation');
            $this->form_validation->set_rules('title', 'Title', 'required|max_length[200]|min_length[10]');
            $this->form_validation->set_rules('intro', 'Intro', 'required|min_length[40]|max_length[50]');
            $this->form_validation->set_rules('cat', 'Category', 'required');
            $this->form_validation->set_rules('body', 'Article', 'required|min_length[3000]|link_check');

            $this->load->model('categories');
            $data['title'] = "Add a new article";
            $data['cats']  = $this->categories->get_all_categories();
            if (!$this->form_validation->run()) {
                $this->load->view('addarticle', $data);
            } else {
                $this->load->model('articles');
                $this->articles->add_new_article();
                $this->load->view('welcome');
            }
        } else {
            redirect('/members/login/', 'refresh');
        }
    }

}
?>

すでにかなり大きなファイルを見ることができますが、それは大きくなるだけです。さて、皆さんへの私の質問は、これはまだ正しいMVCの方法ですか、それとも私は何か間違ったことをしていますか?

ありがとう!

4

2 に答える 2

2

私はCodeIgniterでいくつかの重要な高可用性システムを作成しましたが、それが私の特定のプロジェクトに対して非常に強力で非常に柔軟であることがわかりました。ZFのような他の「エンタープライズ」フレームワークに付属する大きな荷物はありません(ZFには独自の利点がないことは言うまでもありません)。

zeusakmが言ったように、あなたのコントローラーはそれほど巨大ではありません。しかし、それはすべて、あなたが議論のどちら側に立っているかにも依存しfat controller-lean model/lean controller-fat modelます(そこにある他の無数のバリエーション/スタイルと一緒に)。個人的には、コントローラーをできるだけスリムに保つことを好みます。コントローラーが多くのことを実行していると感じ、肥大化する場合は、主にモデルにビジネスオブジェクトを反映させたいという理由で、これらの機能の一部を(モデルではなく)ヘルパーに移動します。また、これらのタスクのいくつかをより適切に形成されたエンティティに結合できる場合、それらをライブラリ(自分自身またはサードパーティ)にマージすることがあります

主なアイデアは、silver-bulletMVCには正しい方法がないということだと思います。あるプロジェクトで機能するものは、別のプロジェクトでは適切ではない可能性があります。検討すべき要素はたくさんあります。結局のところ、コードがeasily maintainableそうである場合、人がread and understandそれほど面倒different roles/responsiblitesなことなくレイアウトできる場合、プログラマー/フロントエンドHTMLデザイナー/バックエンドデータベースコーダーのような人がすべて一緒に作業できる場合お互いのつま先を(あまり)踏まずにフレームワークを簡単に使用できれば、そうです、あなたのMVCはその仕事をしていると思います。

また、URLがMVCにどのようにマッピングされるかは、システムの1つの側面にすぎないことにも注意してください。これは、詳細なモデルにマップするモックコントローラーから、htaccessの書き換え、場合によってはMVCルーターでさえ、URLの解決方法を構成するのに役立つなど、さまざまな方法で処理できます。

于 2012-08-22T19:13:23.680 に答える
0

あなたは完全に正しいことをしています、そしてこのファイルはまだ十分に大きくはありません、そして私はそれがそうなるとは思えません。私はCodeIgniterでプログラミングしました-素晴らしい軽量のFWであり、クールなMVCモデル/パターンの回避策があります。だから、続けてください。

あなたのファイル/コントローラーが1000-1500行のコードを達成しなかった間のもう一つのことは、この質問にあなた自身を悩ませません。

MVCは、モデル(DBクエリ、Herlper関数)、ビュー(テンプレート/ GUI)、コントローラー(ロジック)のすべてではなく、実際にはコントローラーに含まれているものではありません。このことを念頭に置いて、この時点では何も心配しないでください。 。

于 2012-08-22T18:28:12.263 に答える