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エラー応答を取得する方法は?
あなたは閉じ括弧が欠落している '(場合ISSET($のparams [ '言語']))) '。とにかく、これは動作しますが、なぜcheckAccessで、なぜForbiddenHttpExceptionが発生しますか?パラメータの検証にアクセスチェックを呼び出すことは意味がないようです。または私は間違っていますか? – offline
コントローラのコンテンツネゴシエーションフィルタが適用されるときに、エラーメッセージがそこにシリアル化されるという、あらゆる種類のエラーを投げることができます。私は個人的にモデルレベルでそれをやっています。私の更新を確認してください –
これを行うと、検証が行われ、エラーが発生します: '$ 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