【问题标题】:Propel enum with validation通过验证推进枚举
【发布时间】:2017-05-26 04:00:20
【问题描述】:

我有一个用户表,其中有一个性别枚举字段,选项为男/女。如果我创建一个用户,如果我尝试将性别设置为例如“跨性别”,则会引发异常。

是否可以允许将跨性别设置为“跨性别”并且仅在调用 validate() 函数时才会出现验证错误?所以是和其他字段一起验证的?

Schema.xml:

<table name="user" idMethod="native" namespace="Models" package="Models">
    <column name="id" type="INTEGER" sqlType="INTEGER(11) UNSIGNED" primaryKey="true" autoIncrement="true" required="true"/>
    <column name="first_name" type="VARCHAR" required="true"/>
    <column name="mail" type="VARCHAR" required="true"/>
    <column name="gender" type="ENUM" valueSet="male, female"/>
    <behavior name="validate">
        <parameter name="rule1" value="{column: first_name, validator: NotNull}" />
        <parameter name="rule2" value="{column: mail, validator: NotNull}" />
        <parameter name="rule3" value="{column: gender, validator: NotNull}" />
        <parameter name="rule4" value="{column: gender, validator: ValidEnum}" />
    </behavior>
</table>

PHP 代码:

$user = new User();
$user->setFirstName('John');
$user->setMail('johndoe@gmail.com');
$user->setGender('transgender'); // currently throws an exception 
if ($user->validate()) {
    $user->save();
} else {
    // handle exception
}

【问题讨论】:

  • 我在 DATETIME 类型的列中遇到了同样的问题。如果我将其设置为无效日期,则会引发异常。这使得无法使用 DateTime 验证器。
  • 一个简单的解决方案是扩展setter并在那里捕获异常。

标签: php propel2


【解决方案1】:

由于您可能会遇到异常,因此可能会将其包装在 try-catch 块中。

try {
    $user = new User();
    $user->setFirstName('John');
    $user->setMail('johndoe@gmail.com');
    $user->setGender('transgender'); // currently throws an exception 
    $user->save();
} catch (PropelException $e) {
    echo $e->getMessage(); // Value "transgender" is not accepted in this enumerated column
}

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 2012-07-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2014-10-25
    • 2017-12-14
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多