0

大约一周前,我开始尝试使用 CodeIngiter,因为我想学习 OOP。我以为我走在正确的轨道上,但现在我开始怀疑了。原因是,我有一个成员控制器,它正在变成一个很大的文件。这是因为我希望我的网址像成员/登录、成员/注册等。

这是我的控制器:

<?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你站在辩论的哪一边(以及其他无数的变体/风格)。就个人而言,我更喜欢让我的控制器尽可能精简。如果我觉得我的控制器做的事情太多,有时变得臃肿,我将其中一些功能移到帮助器(而不是模型)中,主要是因为我喜欢让我的模型反映业务对象。此外,当其中一些任务可以耦合在一起形成一个结构更完善的实体时,有时我会将它们合并到库中(我自己的或第三方的)

我想主要的想法是 MVC 没有silver-bullet正确的方法——对一个项目有效的方法对另一个项目可能不是一个好主意。有很多因素需要权衡。一天结束,如果你的代码是easily maintainable,如果一个人可以read and understand轻松地布置它,如果有different roles/responsiblites类似程序员/前端 HTML 设计师/后端数据库编码器的人都可以一起工作轻松使用该框架,而无需(太多)互相踩踏,那么是的,我会说您的 MVC 正在完成它的工作。

还要记住,URLS 如何映射到 MVC 只是系统的一个方面。这可以通过多种不同的方式来处理,从映射到详细模型的模拟控制器,htaccess 重写,有时甚至 MVC 路由器可以帮助您配置您希望 URL 解析的方式。

于 2012-08-22T19:13:23.680 回答
0

你正在做完全正确的事情,而且这个文件还不够大,我怀疑它会是。我已经在CodeIgniter上进行了编程——伟大而轻量级的固件,并且有一个很酷的 MVC 模型/模式解决方法。所以就继续吧。

当您的文件/控制器没有达到1000-1500行代码时,另一件事不要用这个问题打扰您自己。

MVC 实际上并不是你的控制器包含的东西,而不是一堆东西模型(数据库查询、Herlper 函数)、视图(模板/GUI)和控制器(逻辑)——记住这一点,此时不要担心任何事情.

于 2012-08-22T18:28:12.263 回答