我刚刚开始使用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