Php 在Yi2中使用缓存时渲染动态csrf隐藏输入

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验证令牌-它应该是动态的(而不是静态的)。有没有其他/更好的方法可以在不禁用和再次启用它的

我在视图中缓存了包含表单的html片段

<?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令牌。让我知道只有一个。但这是因为它不是缓存的-问题只是缓存代码块中的重复令牌-因为令牌应该是动态的(不是缓存的)我必须做这个变通。。。