Codeigniter注册控制器代码审查


Codeigniter Signup Controller code review

我刚刚开始使用MVC框架,特别是Codeigniter,我在维护我的代码和在哪里放置我的功能(控制器或模型)方面遇到了一些麻烦。

现在我正在建立一个注册系统,我有一个控制器的名称注册。php

这是我的代码:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
Class Signup extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        $this->form_validation->set_rules('username', 'Username', 'trim|required|callback_check_valid_username|min_length[6]|max_length[20]|xss_clean');
        $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
        $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[6]|max_length[32]');
        if ($this->form_validation->run() == false){
            $this->load->view("register/index");
        }else{
            $this->submitRegistration();
        }
    }
    public function ajaxup(){
        if ($this->input->isAjaxRequest()){
            header('Content-type: application/json');
            $error = false;
            $message = '';
            $this->form_validation->set_rules('username', 'Username', 'trim|required|callback_check_valid_username|min_length[6]|max_length[20]|xss_clean');
            $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
            $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[6]|max_length[32]');
            if ($this->form_validation->run() == false){
                $message = validation_errors();
                $error = true;
            }else{
                $this->_submitRegistration();
                $message = 'Successfully registered.';
            }
            $return = array(
                'error' => $error,
                'message' => $message
            );
            $return = json_encode($return);
            echo $return;
        }
    }
    public function _submitRegistration(){
        $username = $this->input->post('username');
        $email = $this->input->post('email');
        $password = $this->input->post('password');
        $data = array(
            'username' => $username,
            'email'    => $email,
            'password' => $password
        );
        $this->load->model('users_model');
        $this->users_model->register_user($data);
    }
    public function check_valid_username($username){
        $this->load->model('users_model');
        if (!$this->users_model->is_valid_username($username)){
            $this->form_validation->set_message('check_valid_username', 'The %s field should contain only letters, numbers or periods');
            return false;
        }
        return true;
    }
}

有什么我可以写得更好,以维护我的代码和可读性?

*注意:*函数ajaxup在用户点击按钮并进行ajax调用时使用。

谢谢

看起来很不错。以下是对未来改进的一些想法/建议:

  • index()中,您呼叫$this->submitRegistration(),但我认为您想呼叫$this->_submitRegistration()

  • 由于您在index()ajaxup()方法中使用相同的验证规则,您可以将它们拉出阵列,并使它们成为控制器的属性或将它们放入配置文件。

有关文档,请参阅这里和这里。

$validation_rules = array(
    array(
        'field'   => 'username',
        'label'   => 'Username',
        'rules'   => 'trim|required|callback_check_valid_username|min_length[6]|max_length[20]|xss_clean'
    ),
    array(
        'field'   => 'email',
        'label'   => 'Email',
        'rules'   => 'trim|required|valid_email'
    ),
    array(
        'field'   => 'password',
        'label'   => 'Password',
        'rules'   => 'trim|required|min_length[6]|max_length[32]'
    ),
);

然后在你的方法中,你会做一些类似于$this->form_validation->set_rules($validation_rules)的事情。

  • 考虑重新排序验证规则。例如,让我们看一下用户名字段的规则。如果check_valid_username()正在调用数据库(通过用户模型),那么最好在之前验证长度要求。如果我们可以确定用户名是否无效,那么就没有必要对数据库进行昂贵的调用。

  • 让你的回调方法私有。现在check_valid_username()是一个公共方法,可以通过URL访问。用下划线(_check_valid_username())作为前缀,然后在验证规则中使用callback__check_valid_username

  • 如果你发现自己需要在多个控制器中使用check_valid_username(),你可以扩展本地表单验证库并把它放在那里。

这看起来很好。您似乎拥有位于用户模型中的所有相关功能,并且您正在使用控制器访问它们。如果你不确定的话,我建议你去读读MVC理论。

这是一篇好文章:http://www.codinghorror.com/blog/2008/05/understanding-model-view-controller.html