2016-04-15 5 views
1

languageパラメータにはが必要ですが、私のドキュメントエンドポイントに送信する必要があります。だから私は彼のGET要求でこのパラメータを送信したことを検証しなければなりません。私のモデルでルールを作るYii2 RESTfulサービスでGETリクエストからparamsを検証する方法

は何もしませんでした。

public function rules() 
{ 
    return [ 
     [['language'], 'required'], 
    ]; 
} 

私はこの試みているもののため、次

1)私はParamsValidatorクラスを作成しました:

<?php 
namespace app\modules\v1\components; 

use yii\web\UnprocessableEntityHttpException; 
use yii\base\Component; 
use Yii; 

/** 
* Class that is responsible for validating input params. 
*/ 
class ParamsValidator extends Component 
{ 
    public function validate($params) 
    { 
     if (!isset($params['language'])) { 
      throw new UnprocessableEntityHttpException("Language parameter is required"); 
     } 
    } 
} 

I私のコントローラinit()メソッド内にそのvalidate()メソッドを呼び出しています:

public function init() 
{ 
    $this->_params = Yii::$app->request->queryParams; 

    $validator = new ParamsValidator(); 
    $validator->validate($this->_params); 
} 

そしてこの種の仕事。コードは機能しますが、私は醜い応答を返す。代わりに、素敵なJSON応答の、私はこのように始まるのhtmlの束を得る:

{ 
    "name": "Forbidden", 
    "message": "You are not authorized to do this.", 
    "code": 0, 
    "status": 403, 
    "type": "yii\\web\\ForbiddenHttpException" 
} 

ます。この素敵なJSONエラー:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Unprocessable entity (#422)</title> 
     <style> 
     body { 
      font: normal 9pt "Verdana"; 
      color: #000; 
      background: #fff; 
     } 

代わりに、このHTMLの、私はこのようないくつかの素敵なJSONレスポンスを希望します参照してください:

$behaviors['authenticator'] = [ 
    'class' => HttpBasicAuth::className(), 
    'auth' => [$this, 'authenticate'] 
]; 

しかし、明らかに私のバリデータはこれをしていません。

質問:

1)GETリクエスト経由で来るのparamsを有効にする方法は?
2)私の方法が正しい場合、この素晴らしいJSONエラー応答を取得する方法は?

答えて

1

簡単なオプションは、この内部コントローラを追加することにより、ActiveController::checkAccessメソッドをオーバーライドすることである:

public function checkAccess($action, $model = null, $params = []) 
{ 
    if ($action === 'index' or $action === 'view') 
    { 
     $params = Yii::$app->request->queryParams; 
     if (!isset($params['language'])) { 
      throw new \yii\web\ForbiddenHttpException('You are not authorized to do this.'); 
     } 

    } 
} 

あなたはモデルレベルでそれを行う必要がある場合は、あなたが直接投げるのではなく、addError()メソッドを使用する必要がありますエラー。モデルインスタンスは、validateメソッドを呼び出すときにそれを保持します。あなたの行動の中であなたは単にそれを返すことができます。シリアライズされ、正しい形式でエラーが出力されます。これを達成するには多くの方法があります。簡単な例(シナリオが必要な場合があります)、それを検証する前に、モデルに両方のクエリと体のparamsを渡すためにloadメソッドを使用してことがあります!

$queryParams = Yii::$app->request->queryParams; 
$bodyParams = Yii::$app->request->bodyParams; 

$params = array_merge($queryParams,$bodyParams); 

$model = new $modelClass; 
$model->load($params , ''); 

if ($model->validate() === false) return $model; 
else { 
    // do whatever you need 
} 
+0

あなたは閉じ括弧が欠落している '(場合ISSET($のparams [ '言語']))) '。とにかく、これは動作しますが、なぜcheckAccessで、なぜForbiddenHttpExceptionが発生しますか?パラメータの検証にアクセスチェックを呼び出すことは意味がないようです。または私は間違っていますか? – offline

+0

コントローラのコンテンツネゴシエーションフィルタが適用されるときに、エラーメッセージがそこにシリアル化されるという、あらゆる種類のエラーを投げることができます。私は個人的にモデルレベルでそれをやっています。私の更新を確認してください –

+0

これを行うと、検証が行われ、エラーが発生します: '$ model = new $ this-> modelClass; $ queryParams = Yii :: $ app-> request-> queryParams; $ bodyParams = Yii :: $ app-> request-> bodyParams; $ params = array_merge($ queryParams、$ bodyParams); $ model-> load($ params、 ''); if(!$ model-> validate()){ return $ model; [ { "フィールド": "言語"、 "メッセージ": "言語は空白にできません" } ]と、私が質問したようにJSONの応答を希望します。それはステータスがある必要があります – offline

関連する問題