Php 使用验证推进枚举

Php 使用验证推进枚举,php,propel2,Php,Propel2,我有一个用户表,其中包含一个用于性别的枚举字段,选项为男性/女性。如果我创建了一个用户,如果我试图将性别设置为例如“transgender”,则会引发一个异常 如果我调用validate()函数,是否允许将transgender设置为“transgender”并仅得到验证错误?那么它是与其他字段一起验证的吗 Schema.xml: <table name="user" idMethod="native" namespace="Models" package="Models">

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

如果我调用validate()函数,是否允许将transgender设置为“transgender”并仅得到验证错误?那么它是与其他字段一起验证的吗

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>

因为您可能会得到一个异常,那么也许可以将其包装在一个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
}

我对DATETIME类型的列也有同样的问题。如果我将其设置为未验证日期,则会引发异常。这使得不可能使用DateTime验证器。一个简单的解决方案是扩展setter并捕获那里的异常。
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
}