Php 在Yi2中使用缓存时渲染动态csrf隐藏输入
我在视图中缓存了包含表单的html片段Php 在Yi2中使用缓存时渲染动态csrf隐藏输入,php,caching,csrf,yii2,Php,Caching,Csrf,Yii2,我在视图中缓存了包含表单的html片段 <?php $form = ActiveForm::begin(); ?> <?php echo $form->field($model, 'name'); ?> <?= Html::submitButton('Save') ?> <?php ActiveForm::end() ?> 问题在于CSRF验证令牌-它应该是动态的(而不是静态的)。有没有其他/更好的方法可以在不禁用和再次启用它的
<?php $form = ActiveForm::begin(); ?>
<?php echo $form->field($model, 'name'); ?>
<?= Html::submitButton('Save') ?>
<?php ActiveForm::end() ?>
问题在于CSRF验证令牌-它应该是动态的(而不是静态的)。有没有其他/更好的方法可以在不禁用和再次启用它的情况下渲染它
<?php Yii::$app->request->enableCsrfValidation = false; ?>
<?php $form = ActiveForm::begin(); ?>
<?php Yii::$app->request->enableCsrfValidation = true; ?>
<input type="hidden" name="_csrf" value="<?php echo $this->renderDynamic('return Yii::$app->request->csrfToken;'); ?>">
<?php echo $form->field($model, 'name'); ?>
<?= Html::submitButton('Save') ?>
<?php ActiveForm::end() ?>
我刚刚遇到了同样的问题,在花了几个小时处理不同的事情之后,我终于想出了一种用jQuery修改它的方法
$this->registerJs("$(document).ready(function(){
$('input[name=_csrf]').val('".$this->renderDynamic('return Yii::$app->request->csrfToken;')."');
});", View::POS_END);
然后扔掉里面所有多余的东西
<?php $form = ActiveForm::begin(); ?>
<?php echo $form->field($model, 'name'); ?>
<?= Html::submitButton('Save') ?>
<?php ActiveForm::end() ?>
另一种方式:
<?php $form = ActiveForm::begin(['options' => ['csrf' => false]]); ?>
<input type="hidden" name="<?= $this->renderDynamic('return Yii::$app->request->csrfParam;'); ?>" value="<?= $this->renderDynamic('return Yii::$app->request->csrfToken;'); ?>" />
<?php ActiveForm::end(); ?>
你不必这么做。您是否在layout main.php文件中添加了csrf元标记?更新你的作曲人,我更新了一切。如果我没有这样做,我的表单中有两个隐藏的_csrf令牌…请查看您的视图站点login.php页面。他们正在使用主动形式。检查有多少csrf令牌。让我知道只有一个。但这是因为它不是缓存的-问题只是缓存代码块中的重复令牌-因为令牌应该是动态的(不是缓存的)我必须做这个变通。。。