CodeIgniter 和 Doctrine 从零开始第四天:用户登录 我们按以下步骤建立一个用户登录系统: l
建立登录表单视图和登录控制器 l
学习一些URL helpers l
改变默认控制器 l
进行用户认证 l
学习单例模式,并用它改善我们的代码设计 l
学习Sessions library l
进行用户登出
登录表单视图我们首先创建登录表单视图 system/application/views/login_form.php <!DOCTYPE html> <html lang="en"> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Login Form</title>
<link rel="stylesheet" href="<?php echo base_url(); ?>css/style.css"
type="text/css" media="all">
</head> <body> <div id="signup_form">
<p class="heading">User Login</p>
<?php echo form_open('login/submit'); ?>
<?php echo validation_errors('<p class="error">','</p>'); ?>
<p>
<label for="username">Username: </label>
<?php echo form_input('username',set_value('username')); ?>
</p>
<p>
<label for="password">Password: </label>
<?php echo form_password('password'); ?>
</p>
<p>
<?php echo form_submit('submit','Login'); ?>
</p>
<?php echo form_close(); ?>
<p>
<?php echo anchor('signup','Create an Account'); ?>
</p>
</div> </body> </html> Anchor()建立一个链接。<?php echo anchor('signup','Create an Account'); ?> 返回:<a href="http://localhost/ci_doctrine/signup">Create an Account</a>样式链接编辑样式表,让表单更好看。编辑 css/style.css body {
font-family: "Trebuchet MS",Arial;
font-size: 14px;
background-color: #212426;
color: #11151E;
} a {
color: #FFF;
} a:hover {
color: #B9AA81;
} /* ... */ 红色部分为添加部分。 编辑:system/application/views/signup_form.php 表单下面添加:
<p>
<?php echo anchor('login','Login Form'); ?>
</p>
也就是添加了一个链接到login控制器,但是这个控制器还没有建立,下面我们建立它 Login Controller建立system/application/controllers/login.php <?php class Login extends Controller {
public function __construct() {
parent::Controller();
$this->load->helper(array('form','url'));
$this->load->library('form_validation');
}
public function index() {
$this->load->view('login_form');
}
public function submit() {
if ($this->_submit_validate() === FALSE) {
$this->index();
return;
}
redirect('/');
}
private function _submit_validate() {
}
} 除了红色部分,其它和上次的signup controller类似。 Redirect()他是URL helper的一个函数,作用是转到指定的控制器。这里我们给了‘/’,就是转到home page 也就是 默认控制器。所以,这里会跳转到 http://localhost/ci_doctrine/ 测试登录控制器和视图访问:http://localhost/ci_doctrine/login
现在,点击 Create an Account
你会看到我们以前的Signup 表单页面
工作正常! 默认控制器当用户没有输入控制器名称,会调用默认的控制器。现在我们输入:http://localhost/ci_doctrine/ 你会看到:
因为codeigniter的默认控制器为welcome。这里我们需要的默认控制器名为home。 建立:system/application/controllers/home.php <?php class Home extends Controller {
public function index() {
echo "Home Sweet Home!";
}
} Routes File 路由文件编辑system/application/config/routes.php 改变下面的值: // ... $route['default_controller'] = "home"; $route['scaffolding_trigger'] = ""; // ... Ok,现在访问 http://localhost/ci_doctrine/ 你会看到访问了我们的home控制器,显示: Home Sweet Home! 用户登录鉴定现在我们给程序添加用户登录鉴定的功能。首先,我会告诉你一个简单也是常见的处理方式,过后,我会提供一个更好的方法。 表单身份验证编辑: system/application/controllers/login.php <?php class Login extends Controller {
public function __construct() {
parent::Controller();
$this->load->helper(array('form','url'));
$this->load->library('form_validation');
}
public function index() {
$this->load->view('login_form');
}
public function submit() {
if ($this->_submit_validate() === FALSE) {
$this->index();
return;
}
redirect('/');
}
private function _submit_validate() { $this->form_validation->set_rules('username', 'Username','trim|required|callback_authenticate');
$this->form_validation->set_rules('password', 'Password','trim|required');
$this->form_validation->set_message('authenticate','Invalid login. Please try again.');
return $this->form_validation->run();
}
public function authenticate() {
// 从username取得User对象
if ($u = Doctrine::getTable('User')->findOneByUsername($this->input->post('username'))) {
// 建立对象,为变异(加密)password
$u_input = new User();
$u_input->password = $this->input->post('password');
// 密码匹配 (比较加密的 passwords)
if ($u->password == $u_input->password) {
unset($u_input);
return TRUE;
}
unset($u_input);//注销这个为加密password而生的对象,防止意外保存到数据库里
}
return FALSE;
}
} 红色部分是更新过的。先给_submit_validate()函数,增加了一条规则(绿色部分)。这次用了Callback规则(callback_authenticate
),格式是:callback_[function_name] 第二回绿色部分,是callback_authenticate验证失败后返回的用户自定义错误信息。 Authenticate 函数是回调(callback)函数,如果一切正常,返回真,否则返回假。 测试表单首先,建立一个新的用户 http://localhost/ci_doctrine/signup 现在访问,http://localhost/ci_doctrine/login 输入错误登录信息,你会看到:
如果输入正确的信息,你会转到 home page,看到 Home Sweet Home!我们的登录表单可以使用了。 |