首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2窗体将空白字符串解释为空值

Symfony2窗体将空白字符串解释为空值
EN

Stack Overflow用户
提问于 2012-03-29 23:35:51
回答 7查看 9.4K关注 0票数 14

我有一个包含各种字段的Symfony2表单,其中包括一个名为recap的可选文本字段。

当其中包含一些文本时,此recap字段可以很好地保存,但当该字段保留为空时,我会收到以下错误:

代码语言:javascript
复制
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'recap' cannot be null

没错-列recap不能为null。我故意把它设置成这样。Null的意思是未知。当用户将recap留空时,recap的值不是未知的;它是空的。

我的问题是,当recap为空时,如何让Symfony将其保存为'',而不是null

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-29 23:45:27

转到您的实体并转到变量的声明。

代码语言:javascript
复制
/**
 * @var string $name
 *
 * @ORM\Column(type="string", length=50)
 */
public $recap = '';

您可以为$recap指定默认值。

或者,当您使用函数setRecap时,您可以检查是否为空或未设置,并设置您期望的值。

代码语言:javascript
复制
public function setRecap($recap) {
   $this->recap = !isset($recap) ? '': $recap;
}

或者您将表单类型中的默认值设置为“”,但我认为这不是您所期望的。

票数 15
EN

Stack Overflow用户

发布于 2012-08-12 20:13:32

是的,花了很多时间;-(“转换”是在组件Form.php第1113行中硬编码的!

代码语言:javascript
复制
private function viewToNorm($value)
{
    $transformers = $this->config->getViewTransformers();

    if (!$transformers) {
        return '' === $value ? null : $value;
    }

    for ($i = count($transformers) - 1; $i >= 0; --$i) {
        $value = $transformers[$i]->reverseTransform($value);
    }

    return $value;
}

在我看来,这是一个很大的错误(因为这是DataTransformer的角色,而不是Form)。因此,解决方案是创建您自己的DataTransformer并将其与文本类型相关联。目前我在Symfony2上浪费了太多时间,总是在寻找这些小技巧的来源;-(

票数 11
EN

Stack Overflow用户

发布于 2015-05-20 23:56:35

对于这个问题,我有另一个解决方案:

创建虚拟类

代码语言:javascript
复制
class EmptyString {
    public function __toString() {
        return '';
    }
}

和set

代码语言:javascript
复制
$builder->add('recap', 'text', [
    'empty_data' => new EmptyString(),
]);

当实体存储到数据库时,它会自动转换为空字符串。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9928702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档