CI框架请求的处理逻辑与步骤
跟着视频学了好几个请求的处理,比如登录,忘记密码,重置密码等。大致思考一下这种框架的通用逻辑,方便后面再写的时候比对。
请求进入路由
先要维护对应的Routes.php
文件,比如下面这一串请求。设置对应的get/post方法,
$routes->group('', ['filter' => 'cifilter:guest'], static function ($routes) {
// $routes->view('example-auth','example-auth');
$routes->get('login', 'AuthController::loginForm', ['as' => 'admin.login.form']);
$routes->post('login', 'AuthController::loginHandler', ['as' => 'admin.login.handler']);
$routes->get('forgot-password', 'AuthController::forgotForm', ['as' => 'admin.forgot.form']);
$routes->post('send-password-reset-link', 'AuthController::sendPasswordResetLink', ['as' => 'send-password-reset-link']);
$routes->get('password/reset/(:any)', 'AuthController::resetPassword/$1', ['as' => 'admin.reset-password']);
$routes->post('reset-password-handler/(:any)', 'AuthController::resetPasswordHandler/$1', ['as' => 'reset-password-handler']);
});
第一个参数是url的访问路径,第二个对应控制器的相应方法,as
方法可以将routes 命名一个简单命令,这样在其他地方可以直接引用。例如在view中引用 <form action="<?= route_to('send-password-reset-link');?>" method="POST">
在参数里可以设置对应的filter 在/Config/Filter.php
进行注册
public array $aliases = [
'csrf' => CSRF::class,
'toolbar' => DebugToolbar::class,
'honeypot' => Honeypot::class,
'invalidchars' => InvalidChars::class,
'secureheaders' => SecureHeaders::class,
'cifilter' => CIFilter::class,
];
路由转入控制器
建立相应的控制器以及方法,同时进行相应的逻辑判定。
- 在控制器里面,需要注意可以加载相应的helper 类供后面使用。
protected $helpers = ['url', 'form', 'CIMail'];
例如,加载url, form和CIMail这个helper类,其中CIMail为自己创建的文件。 在控制器里面,可以使用validate方法,但是如果有自己创建的类,需要在
/Config/Validation.php
里面注册相应的类。public array $ruleSets = [ Rules::class, FormatRules::class, FileRules::class, CreditCardRules::class, IsPasswordStrong::class, ];
之后再function里面就可以调用IsPasswordStrong
$isValid = $this->validate([ 'new_password' => [ 'rules' => 'required|min_length[5]|max_length[20]|is_password_strong[new_password]', 'errors' => [ 'required' => 'Enter new password', 'min_length' => 'New password must have at least 5 characters', 'max_length' => 'New password must have at most 20 characters', 'is_password_strong' => 'new password is not strong enough', ] ], 'confirm_new_password' => [ 'rules' => 'required|matches[new_password]', 'errors' => [ 'required' => 'Confirm new password', 'matches' => 'Passwords not match', ] ] ]);
控制器进行跳转View
常用的返回跳转有。
直接返回view界面 并且附带数据。
public function loginForm() { $data = [ 'pageTitle' => 'Login', 'validation' => null ]; return view('backend/pages/auth/login', $data); }
返回跳转到指定的route.
使用这个方法可以跳转到admin.forot.form
路由并附带一个success信息return redirect()->route('admin.forgot.form')->with('success', 'We have email your password reset link')
返回上一个界面
返回上一个界面并且将之前的输入信息返回,同时附带fail提示信息return redirect()->back()->with('fail','Something went wrong!')->withInput();
View界面展示
附带flash data的展示
<?php if (!empty(session()->getFlashdata('fail'))) : ?> <div class="alert alert-danger"> <?= session()->getFlashdata('fail'); ?> <button type="button" class="close" data-dismiss="alert" aria-label="close"> <span aria-hidden="true">×</span> </button> </div> <?php endif; ?>
- 传入变量的引用。
//控制器传入View 的数据
<?php $data = [
'pageTitle' => 'Login',
'validation' => null
]; ?>
//view 界面引用数据中的值
<title><?= isset($pageTitle) ? $pageTitle : "New Page Title"; ?></title>
- Validation部分的引用
在view里面设置了validation变量,再从控制器的方法中传入validator, 在view界面进行error读取。 controller里面的设置
<?php return view('backend/pages/auth/login', [ 'pageTitle' => 'Login', 'validation' => $this->validator, ]); ?>
- View界面的读取验证错误结果
//先初始化一个validation <?php $validation = \Config\Services::validation(); ?> <?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; ?>
总结
透过这段逻辑就实现了从请求到路由到控制器再到view展示的步骤。对于MVC来说,model部分是和controller里面进行交互处理。所以并未特别备注。后面再研究一下model的交互。
评论(0)