C

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

轻松学习 技术 2023-11-28

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,
        
    ];

路由转入控制器

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

  1. 在控制器里面,需要注意可以加载相应的helper 类供后面使用。protected $helpers = ['url', 'form', 'CIMail']; 例如,加载url, form和CIMail这个helper类,其中CIMail为自己创建的文件。
  2. 在控制器里面,可以使用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

常用的返回跳转有。

  1. 直接返回view界面 并且附带数据。

     public function loginForm()
     {
         $data = [
             'pageTitle' => 'Login',
             'validation' => null
         ];
         return view('backend/pages/auth/login', $data);
     }
  2. 返回跳转到指定的route.
    使用这个方法可以跳转到admin.forot.form路由并附带一个success信息

    return redirect()->route('admin.forgot.form')->with('success', 'We have email your password reset link')
  3. 返回上一个界面
    返回上一个界面并且将之前的输入信息返回,同时附带fail提示信息

    return redirect()->back()->with('fail','Something went wrong!')->withInput();

View界面展示

  1. 附带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">&times;</span>
             </button>
         </div>
     <?php endif; ?>
  2. 传入变量的引用。
//控制器传入View 的数据
 <?php   $data = [
        'pageTitle' => 'Login',
        'validation' => null
    ]; ?>
//view 界面引用数据中的值

 <title><?= isset($pageTitle) ? $pageTitle : "New Page Title"; ?></title>
  1. Validation部分的引用
    在view里面设置了validation变量,再从控制器的方法中传入validator, 在view界面进行error读取。
  2. 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的交互。

PREV
CodeIgniter设计验证登录
NEXT
Python生成特定的乘法题

评论(0)

发布评论