定义自定义数据类型?

时间:2018-01-30 16:24:16

标签: coldfusion cfml cfc lucee

我知道,通过在线阅读,当你输入

function foo(required integer ObjectID)

CFML引擎(Lucee for me)查找integer.cfc,因为CFC不支持整数作为数据类型(奇怪)。

对于CF来说,integer.cfc应该是什么样子才能将其视为有效的数据类型。是否存在必须存在的某个位置,或者它是否位于其中一个映射文件夹中?

我做了一些调查尝试,并没有通过反复试验获得任何洞察力。

与大多数数据类型检查一样,用例是我知道预期的数据类型,但它是防止客户端篡改的额外防线,而不必对param或{更加冗长{1}}检查。

另外,如果有人这样做了,你能说出任何性能差异吗?

我知道我可以按照以下方式执行此操作,但这似乎应该是一个不必要的层。

if

为了清晰起见编辑:目前,下面已经过了,但理想情况下我想说function foo(required numeric myID) param name="arguments.myID" type="integer"; ..use the parameter in queries.. ,因此它会失败。

required integer myID

1 个答案:

答案 0 :(得分:2)

CFML中的

Numeric与CFML得到的整数接近

虽然您可以(而且应该)将自定义数据类型定义为类,就像任何OO语言一样,但您可能不应该为特定类型的数字等简单数据类型执行此操作。

ColdFusion中的类型是灰色区域。它是一个字符串。它是一个整数。它可以是布尔值。有些简单的类型你可以搞乱,但会直接输出到屏幕/页面/缓冲区/等等,然后有复杂的类型,如数组,结构和查询,以及你可以用它来显示的CFC类型<cfdump>writeDump

如果您需要知道传入的数据类型是否为整数,那么您可能应该采用不同的方法。

不要声明自己的整数数据类型。特别是在ColdFusion中。请记住,这是一种非常高级的语言,多次从硬件层中删除。通常,出于性能原因,在生产中关闭类型检查。这是有效的,因为ColdFusion中的类型检查主要用作编程工具,而不是用户验证工具。这是仪式的全部。

如果您希望验证用户输入,则有更好的方法。我没有数量感;你要写多少这些?你如何将消息传回给用户?想想更大,但不要太大,以至于你重新定义数学概念。

如果您的表单提交(或REST API?无论输入是什么......)填充了该类型的cfc,而不是单个字段,而是字段集合。假设您正在编辑用户,请创建包含所有属性的User类。

知道类型检查并不能真正做你想要的东西,你可以让所有东西都成为一个字符串(或any),但你可以用它们的验证类型来装饰你的类的属性。

component name="User" {
  // notice that "validateType" is custom metadata, use anything you want
  property name="ID" type="string" validateType="integer";
  property name="Name" type="string" validateType="Name";
}

然后创建一个读取组件元数据的验证器,并以您想要的任何自定义方式进行验证。它可能就像这个未经测试的那样简单:

function validate(component obj) {
    var md = getMetaData(obj);
    for (var prop in md.properties) {
        if (structKeyExists(prop, "validateType") {
            switch (prop.validateType) {
                case "integer":
                isValid("integer", evaluate("obj.get#prop.name#()"));
                break;
                // other custom validation types
            }
        }
    }
}

然后将该验证器放在可重用的位置,例如验证类,或者放在您自己的cfc的超类型中,以便它可以自行验证。

这只是一个想法。有很多方法可以给猫皮肤和验证领域。另一个不错的选择是尝试ValidateThis framework,这将为您设置一个已经为您编写的良好模式和代码。