在 Web 應用開發中,數據驗證是一個重要的環節。在 CodeIgniter 4 (CI4) 中,提供了強大的驗證工具,允許開發者使用內置的驗證規則,同時也支持創建自定義驗證規則。本文將指導您如何在 CI4 中創建一個自定義驗證規則,用於檢查某個值是否存在於指定的資料表中。

創建自定義驗證規則

首先,我們需要在 App\Validation 目錄下創建一個自定義驗證類,例如 MyRules.php

namespace App\Validation;

use CodeIgniter\Database\ConnectionInterface;
use CodeIgniter\Validation\ValidationInterface;

class MyRules
{
    protected $db;

    public function __construct(ConnectionInterface &$db = null, ValidationInterface &$validation = null)
    {
        $this->db = $db ?? \Config\Database::connect();
    }

    public function exists($value, string $field, array $data, string &$error = null): bool
    {
        $parts = explode('.', $field);

        if (count($parts) !== 2) {
            return false;
        }

        [$table, $field] = $parts;
        $row = $this->db->table($table)->where($field, $value)->get()->getRowArray();

        return (bool) $row;
    }
}

在這個類中,我們定義了一個名為 exists 的方法,它將檢查指定資料表的指定欄位中是否存在給定的值。

配置自定義驗證規則

接著,需要在 App\Config\Validation.php 中加入我們的自定義規則類。

namespace Config;

class Validation
{
    public $ruleSets = [
        // 其他內置規則
        \App\Validation\MyRules::class,
    ];
    // ...
}

使用自定義驗證規則

在控制器中,我們可以如下使用這個自定義規則來驗證輸入:

public function project_create(){
    $rules = [
        'ad_project_name' => 'required',
        'advertiser_id' => [
            'rules' => 'required|exists[advertiser.advertiser_id]',
            'errors' => [
                'required' => '廣告主ID為必填',
                'exists' => '廣告主ID不存在'
            ]
        ]
    ];
    if (!$this->validate($rules)) {
        return $this->errorResponse($this->validator->getErrors(), 400);
    }
    // ...
}

在這裡,我們為 advertiser_id 欄位設定了兩個規則:requiredexists[advertiser.advertiser_id]。對於 exists 規則,我們還定義了一個自定義的錯誤訊息。

結論

通過上述步驟,我們在 CodeIgniter 4 中成功創建了一個自定義驗證規則,用於檢查資料表中某個欄位的值是否存在。這種方法增加了驗證過程的靈活性和可重用性,使我們能夠根據具體的應用需求更加精確地控制數據驗證過程。

最後修改日期: 2023 年 12 月 18 日

作者