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

时间:2014-10-12 13:34:18

标签: php function codeigniter methods

判断某个功能应该是私有还是公开的标准是什么或者是什么。

我总是在没有声明功能的情况下进行编码,所以它被视为公共但它运行良好。不过我在指南上读到了这个,

  

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

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

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

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

这会阻止用户直接通过控制器并通过网址访问该功能吗?

我尝试过测试它,虽然我把这行代码放在视图页面上,如果有人试图直接访问视图,它们就会被发送掉。

私有函数出错,而我可以访问声明/假设为public的函数。

功能的标准是什么?必须'私人的。访问数据库等功能?或有价值的数据?喜欢用户输入的信息(敏感信息,如帐户详细信息/用户名密码)?

或者我应该将所有内容保密,以便用户无法直接访问这些功能?

示例:

我已经设置了一个名为' Main'

的默认控制器
    public function index(){ 
    if($this->input->cookie('cookie',TRUE)){

    }
    else
    $this->load->view('login');
}

检查cookie是否存在(如果用户已登录)。如果我将索引功能设置为私有,每当我访问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; }
    }

我宣布它是公开的,因为如果我宣称它是私有的,我的回调会导致致命的错误。用户可以通过链接/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; } 
        } }
        }

EDITED:更改了回调函数以检查输入的用户名是否存在(如果没有显示)

  

'帐户不存在'

,如果返回无效,则显示

  

&#39;密码与<#39;

不符

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

  

&#39;类型&#39;

在我的会话中,但我只是把它放在那里,如果用户是管理员或用户,则无需检查会话,因此他们无法访问彼此的页面。

1 个答案:

答案 0 :(得分:0)

如果您不希望check_account是控制器的操作,则应使用

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

你调用这样的回调:

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

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