发生验证错误时 Symfony2 表单字段未更新

2023-11-25

这是我的表单类型:

class TestFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->add('thumbnail', 'hidden', array(
            'label' => 'Thumbnail',
            'label_attr' => array(
                'class' => 'col-xs-2 control-label'
            ),
            'required' => false,
            'error_bubbling' => true,
            'required' => false
        ));

        $builder->add('thumbnail_data', 'file', array(
            'error_bubbling' => true,
            'required' => false
        ));
    }

    public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'X\LibraryBundle\Entity\Test',
            'cascade_validation' => true,
            'error_bubbling' => true,
        ));

    }

    public function getName()
    {
        return 'test';
    }
}

这里是实体,重要的部分是setThumbnailData($file)方法,它存储缩略图文件,并通过setThumbnail(string)方法设置缩略图路径。

<?php

namespace X\LibraryBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Test
 *
 * @ORM\Table(name="test")
 * @ORM\Entity(repositoryClass="X\LibraryBundle\Repository\TestRepository")
 */
class Test
{
    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    protected $thumbnail;

    /**
     * Set thumbnail
     *
     * @param string $thumbnail
     * @return Test
     */
    public function setThumbnail($thumbnail)
    {
        $this->thumbnail = $thumbnail;

        return $this;
    }

    /**
     * Get thumbnail
     *
     * @return string 
     */
    public function getThumbnail()
    {
        return $this->thumbnail;
    }

    /**
     * This will save file to disk
     * @param $file
     */
    public function setThumbnailData($file) {
        if($file !== null && $file !== false)
        {
            $fileName = $file->getClientOriginalName();
            $baseDir = __DIR__ . '/../../../../../../../web/uploads/promotional_material/';
            $dir =  sha1(microtime());
            while (is_dir($baseDir . $dir)) {
                $dir = sha1(microtime());
            }
            mkdir($baseDir . $dir);
            $this->setThumbnail('/uploads/promotional_material/' . $dir . '/' . $fileName);
            $file->move($baseDir . $dir, $fileName);
        }
    }

    public function getThumbnailData() {
        return '';
    }
}

现在的问题是,如果表单遇到验证错误,则以下树枝行会产生不同的输出,第二行输出正确的值,另一行产生原始缩略图路径。因此,如果我使用 {{ form_widget(form.thumbnail) }} 输出缩略图输入,我会得到原始缩略图路径,而不是应该通过 setThumbnailData() 方法更改的路径。

{{ dump(form.thumbnail.vars.data) }}
{{ dump(form.vars.data.thumbnail) }}

问题是否是由于使用 setThumbnailData() 方法设置缩略图引起的?除了像这样在树枝中硬编码输入之外,不知道如何解决这个问题:

<input type="hidden" name="test[thumbnail]" value="{{ form.vars.value.thumbnail }}"/>

我无法完全解决你的问题,因为在我看来你的做法是错误的。数据类实际上只负责保存您的数据,所以您的方法set/getThumbnailData应该看起来像这样

<?php
// ...
private $thumbnailData;

public function setThumbnailData(UploadedFile $thumbnailData) {
    $this->thumbnailData = $thumbnailData;
}

public function getThumbnailData() {
    return $this->thumbnailData;
}

在你的控制器中有这样的东西:

<?php
// ...
public function formAction() {

    $form = // ... 
    $form->handleRequest($request);
    if($form->isValid()) {
        $test = $form->getData();
        /* @var $test Test */
        $thumbnailUploader = $this->get('thumbnail_uploader');
        /* @var $thumbnailUploader ThumbnailUploadService */

        $file = $test->getThumbnailData();
        $filename = $file->getClientOriginalName();
        $thumbnailUploader->upload($filename, $file);

        // ...
    }
}

我建议将与表单或请求无关的所有逻辑移至服务中。在这种情况下,您的服务可以更通用地处理具有给定文件名的任何 symfony 文件。

<?php
class ThumbnailUploadService {
    /**
     * @param $file Symfony\Component\HttpFoundation\File\File
     *
     */
    public function upload($filename, File $file) {
        // ...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发生验证错误时 Symfony2 表单字段未更新 的相关文章

  • 通过身份验证保护 CodeIgniter 2 应用程序的正确方法是什么?

    I have Ion Auth http benedmunds com ion auth 正确安装并在我的服务器上运行 我也有默认的代码点火器2 新闻 教程在同一个 CI 安装中工作 我只是在玩 并对使用身份验证系统 封闭 或保护整个应用程
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • 点击 %40 变为 %2540

    当单击包含 符号的链接时 该网址给我 40 这就是我想要的 但是一旦我点击它 一秒钟后它就在我点击后变成了 2540 单击是在电子邮件内 然后定向到网站 其中 40 更改为 2540 我怎样才能让它停止变化 它现在得到这样的参数 email
  • 使用 ImageMagick (PHP) 将 2 个图像并排合并为 1 个图像

    我认为这是一件容易的事 我有 2 张图片 JPG 我希望它们合并成一张图片 其中 2 张图片并排 所以我有图片 A 和图片 B 我想要图片 AB 并排 两个图像具有相同的宽度和高度 在本例中 宽度 200px 高度 300px 但是第二个图
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv
  • 更改 Woocommerce 中“我的帐户”页面上的标题

    我见过大量有关如何使用 WooCommerce 我的帐户仪表板重新排序 更改导航和页面的示例 但我一生都无法弄清楚如何更改每个部分的主要标题 我的帐户 订单 下载 地址等 我已经搜索过模板 但没有任何乐趣 我尝试使用条件 php 注释来回显
  • 正则表达式上的换行符

    我试图替换两个标签之间的所有内容 但我无法构建正确的表达式 这就是我所做的
  • 在 PHP 中包含 PHP 文件

    我有一个网站 它运行 PHP if 语句来根据附加文件的类型 即 Jpg Txt MP4 显示内容 所以我显示 TXT 文件的代码是 if post attachment txt display attachment div class d
  • 使用 ImageMagick 和 PHP 将 PNG 转换为 JPG 并将透明背景设置为白色

    将图像从 PNG 转换为 JPEG 时 如何使用 ImageMagick 带有 php 扩展 将透明背景设置为白色 在撰写本文时 您尚未指定正在使用哪个扩展 但如果您使用命令行 则命令将是 convert image png backgro
  • get url 重定向时 File_get_contents() 不起作用

    我正在使用的功能是 function http post url data data url http build query data data len strlen data url date default timezone set
  • 如何将我的 init 函数中的代码集中到所有控制器中?

    public function init this gt view gt user Zend Auth getInstance gt getIdentity this gt view gt siteName Zend Registry ge
  • 如何在多次尝试后延迟登录尝试 (PHP)

    我正在开发一个用 PHP 构建的相当大的网站 该网站可能会有很多用户 我正在寻找一种方法来保护登录屏幕免受自动尝试的影响 我已经在注册表中添加了验证码检查 但还想进一步强化网站 据我所知 StackOverflow 上也有类似的问题 而且我
  • 如何纠正这个非法字符串偏移?

    我收到此错误 警告 第 32 行 home mysite public html wp content themes evento lib php extra class php 中的非法字符串偏移 type 我意识到文件中的这部分代码是错
  • Facebook 应用程序无法获取会话

    我正在 Heroku 上为 Facebook 开发一个非常基本的 PHP 应用程序 它显示非常基本的用户信息 如姓名 个人资料图片 但该应用程序在 getToken 方法中停止 我在登录我的个人资料后尝试了该应用程序 但仍然出现相同的消息
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • 如何在 Zend MVC 中实现 SSL

    我之前已经通过使用特定的安全文件夹 例如服务器上的 https 文件夹与 http 文件夹 实现了安全页面 我已经开始使用 Zend Framework 并希望应用程序的某些部分 例如登录 使用 https 我在谷歌上搜索过 甚至在这里搜索
  • 如何通过php获取网页的Open Graph协议?

    PHP 有一个简单的命令来获取网页的元标记 get meta tags 但这仅适用于具有名称属性的元标记 然而 开放图谱协议如今变得越来越流行 从网页获取 opg 值的最简单方法是什么 例如 我看到的基本方法是通过 cURL 获取页面并使用
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one
  • Stream_context_set_params 不适用于 ssh2.sftp 包装器

    我想使用类似的功能here http www php net manual en function stream notification callback php 请检查以下代码 function notify notification
  • 如何使用 php 将 *.xlsb 转换为数组或 *.csv

    我正在尝试转换 xlsb文件到php array or csv文件 或至少 xls 我尝试使用PHPExcel 但看起来它无法识别该文件中的内容 我注意到 你可以重命名 xlsb文件到 zip文件 然后使用命令行解压缩unzip zip 之

随机推荐