CodeIgniter设计验证登录
需求为在登录时验证账户是邮箱地址还是账户名,同时验证账户密码长度以及是否存在资料库中。
1. 登录界面设计
从DeskApp里面直接复制对应的html代码即可,同时需要注意这个在于将HTML进行切割成不同的layout 部分。这样方便后面的复用。针对页首页脚侧边栏等采用<?= include('inc/footer.php'); ?>)
方式来引用。 而对于要传入的内容则使用 <?= $this->renderSection('content'); ?>
,在具体的页面里使用extend扩展其他页面,而section则传入相应的值。
1 2 3 4
| <?= $this->extend('backend/layout/auth-layout')?> <?= $this->section('content'); ?> Auth page content here ......... <?= $this->endSection();?>
|
2. 控制器设置
在admin group下面增加login的get 和Post方法的控制器。分别用于打开login界面和提交登录系统。
$routes->view()
可以直接展示view界面,而不用控制器中转。
- 使用
['as'=>'admin.handler']
可以设置别名,方便在view界面进行控制,使用范例<form action="<?= route_to('admin.login.handler') ?> " method="POST">
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $routes->group('admin',static function($routes){
$routes->group('',[],static function($routes){
$routes->get('home','AdminController::index',['as'=>'admin.home']); $routes->get('logout','AdminController::logoutHandler',['as'=>'admin.logout']);
}); $routes->group('',[],static function($routes){ $routes->get('login','AuthController::loginForm',['as'=>'admin.login.form']); $routes->post('login','AuthController::loginHandler',['as'=>'admin.login.handler']);
}); });
|
3. Validation
是用$this->validate()
方法去验证log_id 。rules为验证的规则,一般采用系统默认的一些规则。其中要注意的是is_not_unique
,这个方法的参数是table.column
,可以直接去数据库进行查询是否存在。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public function loginHandler() { $fieldType = filter_var($this->request->getVar('login_id'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; if ($fieldType == 'email') { $isValid = $this->validate([ 'login_id' => [ 'rules' => 'required|valid_email|is_not_unique[users.email]', 'errors' => [ 'required' => 'Email is required', 'valid_email' => 'Email is not valid', 'is_not_unique' => 'Email is not exists in our system.' ] ], 'password' => [ 'rules' => 'required|min_length[5]|max_length[45]', 'errors' => [ 'required' => 'password is required', 'min_length' => 'min_length is 5', 'max_length' => 'max_length is 45.' ] ] ]); } else { $isValid = $this->validate([ 'login_id' => [ 'rules' => 'required|is_not_unique[users.username]', 'errors' => [ 'required' => 'username is required', 'is_not_unique' => 'username is not exists in our system.' ] ], 'password' => [ 'rules' => 'required|min_length[5]|max_length[45]', 'errors' => [ 'required' => 'password is required', 'min_length' => 'min_length is 5', 'max_length' => 'max_length is 45.' ] ] ]); }
|
4. 界面传参
在示例文件中,将view界面创建了一个validation实例。<?php $validation = \Config\Services::validation(); ?>
。而将控制器里面的实例$this->validator()
传给了view界面的$validation
。使用geterror()获取对应的验证信息。
1 2 3 4 5
| <?php if ($validation->getError('login_id')) : ?> <div class="d-block text-danger" style="margin-top:-25px; margin-bottom:15px"> <?= $validation->getError('login_id'); ?> </div> <?php endif; ?>
|
CodeIgniter设计登出
直接调用function移除session里面的相关数据。
1 2 3 4 5 6
| public static function forget() { $session = session(); $session->remove('logged_in'); $session->remove('userdata'); }
|