使用yii只帶驗證器(因為比較熟悉)實現有兩種方式(效果都不佳)。
針對每個請求單獨寫個 Model , 定義" />

yii2 在控制器中驗證請求參數的使用方法

 更新時間:2019-06-25 06:01:06   作者:佚名   我要評論(0)

寫api接口時一般會在控制器中簡單驗證參數的正確性。
使用yii只帶驗證器(因為比較熟悉)實現有兩種方式(效果都不佳)。
針對每個請求單獨寫個 Model , 定義

寫api接口時一般會在控制器中簡單驗證參數的正確性。

使用yii只帶驗證器(因為比較熟悉)實現有兩種方式(效果都不佳)。

針對每個請求單獨寫個 Model , 定義驗證規則并進行驗證。 缺點:寫好多參數驗證的 Model 類。

使用 獨立驗證器 中提到的 $validator->validateValue() 方法直接驗證變量值。缺點:寫實例化很多驗證器對象。
有么有“一勞永逸”的做法,像在 Model 中通過 rules 方法定義驗證規則并實現快速驗證的呢?有!

使用方法(實現效果)

namespace frontend\controllers\api;
use yii\web\Controller;
use common\services\app\ParamsValidateService;
class ArticleController extends Controller
{
  // 文章列表
  public function actionList()
  {
    $PVS = new ParamsValidateService();
    $valid = $PVS->validate(\Yii::$app->request->get(), [
      ['category_id', 'required'],
      ['category_id', 'integer'],
      ['keyword', 'string'],
    ]);
    if (!$valid) {
      $this->apiError(1001, $PVS->getErrorSummary(true));
    }
    //...
  }
  // 新增文章
  public function actionPost()
  {
    $PVS = new ParamsValidateService();
    $valid = $PVS->validate(\Yii::$app->request->get(), [
      [['category_id', 'title', 'content'], 'required'],
      ['category_id', 'integer'],
      [['title'], 'string', 'max' => 64],
      [['content'], 'string'],
    ]);
    if (!$valid) {
      $this->apiError(1001, $PVS->getErrorSummary(true));
    }
    //...
  }
  // 文章刪除
  public function actionDelete()
  {
    $PVS = new ParamsValidateService();
    $valid = $PVS->validate(\Yii::$app->request->get(), [
      ['article_id', 'required'],
      ['article_id', 'integer'],
    ]);
    if (!$valid) {
      $this->apiError(1001, $PVS->getErrorSummary(true));
    }
    //...
  }
}

實現方法

定義參數驗證模型

定義參數驗證模型 ParamsValidateModel ,繼承 yii\db\ActiveRecord ,重寫 attributes() 方法,主要功能:

  • 驗證規則可從對象外部進行設置。
  • 從驗證規則中獲取可賦值的屬性。
<?php
namespace common\models\app;
use yii\db\ActiveRecord;
class ParamsValidateModel extends ActiveRecord
{
  /**
   * @var array 驗證規則
   */
  private $_rules = [];
  private $_attributes = [];
  // 設置驗證規則
  public function setRules($rules)
  {
    $this->_rules = $rules;
    foreach ($rules as $item) {
      $this->_attributes = array_unique(array_merge($this->_attributes, (array)$item[0]));
    }
  }
  // 重寫獲取驗證規則
  public function rules()
  {
    return $this->_rules;
  }
  // 設置可用屬性列表
  public function attributes()
  {
    return $this->_attributes;
  }
}

定義參數驗證服務類

定義參數驗證服務類,主要功能有:

  • 設置參數列表和參數規則列表。
  • 使用 參數驗證模型 進行驗證和存儲驗證錯誤消息。
  • 使用魔術方法獲取 參數驗證模型 中的驗證錯誤消息。
<?php
namespace common\services\app;
use common\models\app\ParamsValidateModel;
use yii\base\Component;
/**
 * Class ParamsValidateService
 * @package common\services\app
 * @method array getErrors(\string $attribute)
 * @method array getFirstErrors()
 * @method array getFirstError(\string $attribute)
 * @method array getErrorSummary(\boolean $showAllErrors)
 */
class ParamsValidateService extends Component
{
  /**
   * @var ParamsValidateModel 模型
   */
  private $model = null;
  public function init()
  {
    parent::init();
    $this->model = new ParamsValidateModel();
  }
  /**
   * @param array $data 數據項
   * @param array $rules 驗證規則
   * @return bool
   */
  public function validate($data, $rules)
  {
    // 添加驗證規則
    $this->model->setRules($rules);
    // 設置參數
    $this->model->load($data, '');
    // 進行驗證
    return $this->model->validate();
  }
  public function __call($name, $params)
  {
    if ($this->model->hasMethod($name)) {
      return call_user_func_array([$this->model, $name], $params);
    } else {
      return parent::__call($name, $params);
    }
  }
}

總結

以上所述是小編給大家介紹的yii2 在控制器中驗證請求參數的使用方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

您可能感興趣的文章:

  • Yii2驗證器(Validator)用法分析
  • yii2 modal彈窗之ActiveForm ajax表單異步驗證
  • Yii2增加驗證碼步驟詳解
  • yii2中的rules 自定義驗證規則詳解
  • Yii2使用駝峰命名的形式訪問控制器(實例講解)
  • Yii2設置默認控制器的兩種方法
  • Yii2使用$this->context獲取當前的Module、Controller(控制器)、Action等
  • Yii2創建控制器(createController)方法詳解
  • yii2控制器Controller Ajax操作示例

相關文章

  • php設計模式之裝飾模式應用案例詳解

    php設計模式之裝飾模式應用案例詳解

    本文實例講述了php設計模式之裝飾模式。分享給大家供大家參考,具體如下: 介紹 裝飾者模式(Decorator Pattern)允許你向一個現有的對象添加新的功能,同
    2019-06-25
  • yii2 在控制器中驗證請求參數的使用方法

    yii2 在控制器中驗證請求參數的使用方法

    寫api接口時一般會在控制器中簡單驗證參數的正確性。 使用yii只帶驗證器(因為比較熟悉)實現有兩種方式(效果都不佳)。 針對每個請求單獨寫個 Model , 定義
    2019-06-25
  • PHP Trait代碼復用類與多繼承實現方法詳解

    PHP Trait代碼復用類與多繼承實現方法詳解

    本文實例講述了PHP Trait代碼復用類與多繼承實現方法。分享給大家供大家參考,具體如下: 前言 眾所周知,一直以來PHP和很多語言一樣是單繼承的語言,但是常常
    2019-06-25
  • php常用字符串查找函數strstr()與strpos()實例分析

    php常用字符串查找函數strstr()與strpos()實例分析

    本文實例講述了php常用字符串查找函數strstr()與strpos()。分享給大家供大家參考,具體如下: string strstr ( string $haystack , mixed $needle [, bool $b
    2019-06-25
  • PHP進階學習之依賴注入與Ioc容器詳解

    PHP進階學習之依賴注入與Ioc容器詳解

    本文實例講述了PHP依賴注入與Ioc容器。分享給大家供大家參考,具體如下: 背景 在很多編程語言(例如java)開發中,程序員在某個類中需要依賴其它類的方法,則通
    2019-06-25
  • php用戶名的密碼加密更安全的方法

    php用戶名的密碼加密更安全的方法

    php中對用戶密碼的加密主要有兩種方法,一種是利用md5加密,另一種是利用password_hash加密,兩種方法中后一種的方法比前一種方法安全很多,幾乎不能被黑客破
    2019-06-25
  • thinkphp整合系列之極驗滑動驗證碼geetest功能

    thinkphp整合系列之極驗滑動驗證碼geetest功能

    給一個央企做官網,登錄模塊用的thinkphp驗證碼類。但是2019-6-10到12號,國家要求央企檢驗官網漏洞,防止黑客攻擊,正直貿易戰激烈升級時期,所以各事業單位
    2019-06-25
  • PHP進階學習之Geo的地圖定位算法詳解

    PHP進階學習之Geo的地圖定位算法詳解

    本文實例講述了PHP進階學習之Geo的地圖定位算法。分享給大家供大家參考,具體如下: 前言 日常開發中我們經常需要查找某個物體的定位,或者查找附近的范圍等
    2019-06-25
  • PHP判斷函數是否被定義的方法

    PHP判斷函數是否被定義的方法

    本教程將介紹判斷函數是否被定義 新建一個246.php,如圖所示: 輸入php網頁的結構(<&#63;php&#63;>),如圖所示: 聲明PHP與瀏覽器交互的文件類型和編碼,如
    2019-06-25
  • Laravel使用RabbitMQ的方法示例

    Laravel使用RabbitMQ的方法示例

    導語 RabbitMQ 想必大家都有了解,不做多介紹來。這里實現的是用 RabbitMQ 作為 Larvel 隊列的驅動,替代 Redis。下面以 Laradock 中安裝示例。 安裝 切
    2019-06-25

最新評論

黑龙江新11选5开奖结果