如何/用什么(标准)来决定CI中的功能是私有的还是公共的


How/what(criteria) to decide if the function should be private or public in CI

决定函数是私有函数还是公共函数的标准是什么。

我总是在不声明函数的情况下进行编码,所以它被视为公共函数,但它运行得很好。然而,我在指南上读到了这一点

在某些情况下,您可能希望某些功能对公共访问隐藏。要使函数私有化,只需添加一个下划线作为名称前缀,它将不会通过URL请求提供。例如,如果你有这样一个函数:

控制器中的公共访问功能如何?

我在我制作的每个控制器上都有这行代码。

 if ( ! defined('BASEPATH')) exit('No direct script access allowed');

这阻止了用户直接通过控制器并通过url访问函数,对吗?

我试着测试它,尽管我放了那行代码,这行代码适用于视图页面,但如果有人试图直接访问视图,他们会被发送出去。

当我可以访问声明/假定为public的函数时,private函数会出错。

函数"必须"为私有函数的条件是什么。访问数据库之类的功能?还是有价值的数据?喜欢用户输入的信息(敏感信息,如帐户详细信息/用户名密码)?

或者我应该把所有东西都保密,这样用户就不能直接访问这些功能了?

示例:

我设置了一个名为"Main"的默认控制器

    public function index(){ 
    if($this->input->cookie('cookie',TRUE)){
    }
    else
    $this->load->view('login');
}

检查cookie是否存在(如果用户已经登录)。如果我将索引函数设置为private,那么每当我访问root/main文件夹时,它都无法访问。所以我把它设置为公开的。我的推理合乎逻辑/合理吗?

public function login(){
$this->form_validation->set_rules('username', 'Username', 'required|callback_check_account');
$this->form_validation->set_rules('password', 'Password', 'required');
if($this->form_validation->run() == FALSE){
$this->load->view('login'); //i tried using redirect, but it does not pass the error message for validation
}else{
}
}

我将登录函数声明为public。由于所需的数据是通过登录表单提交的,因此在调用回调函数时也无法访问。

 public function check_account($username){
    $data = array('username' => $username, 'password' => $_POST['password']);
    $result = $this->LoginModel->validate_account($data);
    if(empty($result)){
    $this->form_validation->set_message('check_account' , 'account does not exist');
    $this->form_validation->set_message('required' , '');
    return FALSE;
    } else if($result == 'invalid'){
    $this->form_validation->set_message('check_account' , 'password does not match');
    $this->form_validation->set_message('required' , '');
    return FALSE;
    } else if($result){
        $isLoggedin = array( 'username' => $result['username'] , 'type' => $result['status'] ,  'is_loggedin' => TRUE);
        $this->session->set_userdata($isLoggedin);
    return TRUE; }
    }

我将它声明为public,因为如果我将其声明为private,我的回调将导致致命错误。用户可以通过链接/Main/check_account/username 访问

型号:

 function validate_account($data){
        $this->db->select('username,password')->where('username' , $data['username']);
        $query = $this->db->get('admin')->result_array();
        if(!empty($query)){
            foreach($query as $row){
                if($data['password'] != $row['password']){
                return 'invalid'; } 
                else $query = array('username' => $row['username'] , 'password' => $row['password'] , 'status' => 'administrator');
 return $query; } 
        } else {
        $this->db->select('username,password')->where('username' , $data['username']);
        $query = $this->db->get('user_mst')->result_array();
        if(!empty($query)){
            foreach($query as $row){
                if($data['password'] != $row['password']){
                return 'invalid'; } 
                else $query['status'] = 'user'; return $query; } 
        } }
        }

已编辑:更改了回调函数,如果不显示,则检查输入的用户名是否存在

"帐户不存在"

,如果返回无效,则显示

"密码不匹配"

如果它返回$query,我将设置会话以及帐户状态,因为我只为管理员和用户创建了一个登录名。我仍然不知道我将如何使用

"类型"

在我的会话中,但我只是把它放在那里,以防不需要检查会话,如果用户是管理员或用户,他们就不能访问彼此的页面。

如果你不想让check_account成为控制器的一个动作,你应该使用

public function _check_account($value) { ... }

然后调用这样的回调:

$this->form_validation->set_rules('username', 'Username', 'required|callback__check_account');

请注意,在"callback"answers"check"之间有两个下划线"_"。此外,提交的表单字段的值将是回调的参数。