gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:22:40 26 4
gpt4 key购买 nike

这是我的表单类型:

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()方法设置缩略图导致的吗?除了像这样在 Twig 中硬编码输入之外,不知道如何解决这个问题:

<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;
}

在你的 Controller 中你有这样的东西:

<?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) {
// ...
}
}

关于php - 发生验证错误时 Symfony2 表单字段未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28439389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com