Yii2 unique validation error: Array to string conversion
Yii2 unique validation error: Array to string conversion
我遵循了 Yii2 Documentation 中提到的完全相同的过程,但在 AJAX 验证时出现数组到字符串转换错误。
场景: 在注册表单中启用 AJAX 验证,包括服务器端验证,如电子邮件唯一验证。
视图中所做的更改
use yii\widgets\ActiveForm;
<?php $form = ActiveForm::begin([
'id' => 'form-signup',
'enableAjaxValidation' => true,
]); ?>
在控制器中所做的更改
use yii\web\Response;
use yii\widgets\ActiveForm;
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
** 注册小部件 **
<?php
namespace frontend\components;
use Yii;
use frontend\models\SignupForm;
use common\models\User;
use yii\base\Widget;
use yii\web\Response;
use yii\widgets\ActiveForm;
/**
* SignUpFormWidget is a widget that provides user signup functionality.
*/
class SignUpFormWidget extends Widget
{
/**
* @var string the widget title. Defaults to 'Register'.
*/
public $title='Register';
/**
* @var boolean whether the widget is visible. Defaults to true.
*/
public $visible = true;
public function run()
{
if($this->visible) {
$model = new SignupForm();
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
}
}
return $this->render('signUpWidget', [
'model' => $model,
]);
}
}
}
错误
[error][yii\base\ErrorException:8] exception 'yii\base\ErrorException' with message 'Array to string conversion' \vendor\yiisoft\yii2\base\Widget.php:107
我试过使用 json_encode($error)
,但它正在重新加载页面,我无法重新加载页面,因为注册表单位于隐藏 div 下的页眉上。我创建了扩展 Widget 的 SignUpFormWidget。
请提出建议,我在这里缺少什么?
您正在使用这个Yii::$app->response->format = Response::FORMAT_JSON;
这意味着您正在获取数组中的值。因此请尝试从数组中获取值然后对其进行验证,或者按照评论中的说明对其进行评论。您无法将数组验证为字符串,因此它给您错误。
将您的控制器代码更新为
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return yii\helpers\Json::encode(\yii\widgets\ActiveForm::validate($model));
}
你的错误是因为 Widget::run()
方法需要 return 一个字符串。 ActiveFrom::validate()
returns 一个数组。正如@DoubleH 上面所建议的,您需要将代码重写为
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return yii\helpers\Json::encode(\yii\widgets\ActiveForm::validate($model));
}
我遵循了 Yii2 Documentation 中提到的完全相同的过程,但在 AJAX 验证时出现数组到字符串转换错误。
场景: 在注册表单中启用 AJAX 验证,包括服务器端验证,如电子邮件唯一验证。
视图中所做的更改
use yii\widgets\ActiveForm;
<?php $form = ActiveForm::begin([
'id' => 'form-signup',
'enableAjaxValidation' => true,
]); ?>
在控制器中所做的更改
use yii\web\Response;
use yii\widgets\ActiveForm;
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
** 注册小部件 **
<?php
namespace frontend\components;
use Yii;
use frontend\models\SignupForm;
use common\models\User;
use yii\base\Widget;
use yii\web\Response;
use yii\widgets\ActiveForm;
/**
* SignUpFormWidget is a widget that provides user signup functionality.
*/
class SignUpFormWidget extends Widget
{
/**
* @var string the widget title. Defaults to 'Register'.
*/
public $title='Register';
/**
* @var boolean whether the widget is visible. Defaults to true.
*/
public $visible = true;
public function run()
{
if($this->visible) {
$model = new SignupForm();
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
}
}
return $this->render('signUpWidget', [
'model' => $model,
]);
}
}
}
错误
[error][yii\base\ErrorException:8] exception 'yii\base\ErrorException' with message 'Array to string conversion' \vendor\yiisoft\yii2\base\Widget.php:107
我试过使用 json_encode($error)
,但它正在重新加载页面,我无法重新加载页面,因为注册表单位于隐藏 div 下的页眉上。我创建了扩展 Widget 的 SignUpFormWidget。
请提出建议,我在这里缺少什么?
您正在使用这个Yii::$app->response->format = Response::FORMAT_JSON;
这意味着您正在获取数组中的值。因此请尝试从数组中获取值然后对其进行验证,或者按照评论中的说明对其进行评论。您无法将数组验证为字符串,因此它给您错误。
将您的控制器代码更新为
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return yii\helpers\Json::encode(\yii\widgets\ActiveForm::validate($model));
}
你的错误是因为 Widget::run()
方法需要 return 一个字符串。 ActiveFrom::validate()
returns 一个数组。正如@DoubleH 上面所建议的,您需要将代码重写为
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return yii\helpers\Json::encode(\yii\widgets\ActiveForm::validate($model));
}