温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

YII 2.0 Bad Request (#400)

发布时间:2020-07-02 22:39:51 来源:网络 阅读:1468 作者:xtceetg 栏目:开发技术


post提交表单的时候出现在这个错误是因为Yii2.0默认开启了_crsf的验证

可以在控制器里局部禁用
public $enableCsrfValidation = false ->覆盖父类的属性

也可以在配置文件中全局禁用
 'components' => [
        'request' => [
            /**
            /*!!! insert a secret key in the following (if it is empty) - this is required by    
            /*cookie validation
            /**
            'cookieValidationKey' => '83r5HbITBiMfmiYPOZFdL-raVp4O1VV4',
            'enableCookieValidation' => false,
            'enableCsrfValidation' => false,
        ]

当然,我们并不建意这样做。

如果是用ActiveForm生成的表单,用传统的POST提交这里是不会有问题的。

我们可以来看看YII2.0的源码。

\yii\widgets\ActiveForm
这个类里面有一个run方法
/**
     * Runs the widget.
     * This registers the necessary javascript code and renders the form close tag.
     * @throws InvalidCallException if `beginField()` and `endField()` calls are not matching
     */
    public function run()
    {
        if (!empty($this->_fields)) {
            throw new InvalidCallException('Each beginField() should have a matching endField() call.');
        }

        $content = ob_get_clean();
        echo Html::beginForm($this->action, $this->method, $this->options);
        echo $content;

        if ($this->enableClientScript) {
            $id = $this->options['id'];
            $options = Json::htmlEncode($this->getClientOptions());
            $attributes = Json::htmlEncode($this->attributes);
            $view = $this->getView();
            ActiveFormAsset::register($view);
            $view->registerJs("jQuery('#$id').yiiActiveForm($attributes, $options);");
        }

        echo Html::endForm();
    }
可以看到 echo Html::beginForm($this->action, $this->method, $this->options);这样一句。
在Html::beginForm()这个方法里面
if ($csrf && $request->enableCsrfValidation && strcasecmp($method, 'post') === 0) {
    $hiddenInputs[] = static::hiddenInput($request->csrfParam, $request->getCsrfToken());
}
这样一段代码就是在表单写入了一个hide input加入了_csrf
如果不是用的ActiveForm则需要手动加入:
<input type="hidden" name="<?php echo Yii::$app->request->csrfParam;?>" value="<?php echo Yii::$app->request->getCsrfToken();?>">

如果是ajax post则要在data后面也带上这个参数

YII2.0 标准写法

<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <?= Html::csrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
表单
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
<?php ActiveForm::end(); ?>


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI