CI框架处理请求的逻辑
Cemon_Liu Lv4

CI框架请求的处理逻辑与步骤

跟着视频学了好几个请求的处理,比如登录,忘记密码,重置密码等。大致思考一下这种框架的通用逻辑,方便后面再写的时候比对。

请求进入路由

先要维护对应的Routes.php文件,比如下面这一串请求。设置对应的get/post方法,

1
2
3
4
5
6
7
8
9
$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进行注册

1
2
3
4
5
6
7
8
9
public array $aliases = [
'csrf' => CSRF::class,
'toolbar' => DebugToolbar::class,
'honeypot' => Honeypot::class,
'invalidchars' => InvalidChars::class,
'secureheaders' => SecureHeaders::class,
'cifilter' => CIFilter::class,

];

路由转入控制器

建立相应的控制器以及方法,同时进行相应的逻辑判定。

  1. 在控制器里面,需要注意可以加载相应的helper 类供后面使用。protected $helpers = ['url', 'form', 'CIMail']; 例如,加载url, form和CIMail这个helper类,其中CIMail为自己创建的文件。
  2. 在控制器里面,可以使用validate方法,但是如果有自己创建的类,需要在/Config/Validation.php里面注册相应的类。
    1
    2
    3
    4
    5
    6
    7
    public array $ruleSets = [
    Rules::class,
    FormatRules::class,
    FileRules::class,
    CreditCardRules::class,
    IsPasswordStrong::class,
    ];
    之后再function里面就可以调用IsPasswordStrong
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $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

常用的返回跳转有。

  1. 直接返回view界面 并且附带数据。
    1
    2
    3
    4
    5
    6
    7
    8
    public function loginForm()
    {
    $data = [
    'pageTitle' => 'Login',
    'validation' => null
    ];
    return view('backend/pages/auth/login', $data);
    }
  2. 返回跳转到指定的route.
    使用这个方法可以跳转到admin.forot.form路由并附带一个success信息
    1
    return redirect()->route('admin.forgot.form')->with('success', 'We have email your password reset link')
  3. 返回上一个界面
    返回上一个界面并且将之前的输入信息返回,同时附带fail提示信息
    1
    return redirect()->back()->with('fail','Something went wrong!')->withInput();

View界面展示

  1. 附带flash data的展示

    1
    2
    3
    4
    5
    6
    7
    8
    <?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">&times;</span>
    </button>
    </div>
    <?php endif; ?>
  2. 传入变量的引用。

1
2
3
4
5
6
7
8
//控制器传入View 的数据
<?php $data = [
'pageTitle' => 'Login',
'validation' => null
]; ?>
//view 界面引用数据中的值

<title><?= isset($pageTitle) ? $pageTitle : "New Page Title"; ?></title>
  1. Validation部分的引用
    在view里面设置了validation变量,再从控制器的方法中传入validator, 在view界面进行error读取。
  • controller里面的设置
    1
    2
    3
    4
    5
    <?php         
    return view('backend/pages/auth/login', [
    'pageTitle' => 'Login',
    'validation' => $this->validator,
    ]); ?>
  • View界面的读取验证错误结果
    1
    2
    3
    4
    5
    6
    7
    8
    //先初始化一个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的交互。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量