通过在线阅读,我知道,当您键入时
function foo(required integer ObjectID)
CFML 引擎(对我来说是 Lucee)会查找 integer.cfc,因为 CFC 不支持整数作为数据类型(很奇怪)。
对于 CF 来说,integer.cfc 应该是什么样子才能将其视为有效的数据类型。它是否必须位于某个位置,或者可以位于映射的文件夹之一中?
我已经进行了一些调查尝试,但通过反复试验并没有真正获得任何见解。
与大多数数据类型检查一样,用例是我知道预期的数据类型,但它是防止客户端篡改的额外防线,而不必使用更详细的 param
或 if
检查。
此外,如果有人这样做过,您能谈谈性能差异吗?
我知道我可以按如下方式执行此操作,但这似乎应该是一个不必要的层。
function foo(required numeric myID)
param name="arguments.myID" type="integer";
..use the parameter in queries..
为清楚起见进行编辑:目前,以下内容通过,但理想情况下我想说需要整数 myID
,因此它会失败。
<cfscript>
function TestNum(required numeric myID) {
return myID;
}
writeoutput(TestNum(8.3));
</cfscript>
最佳答案
CFML 中的 Numeric
接近 CFML 得到的整数
虽然您可以(并且应该)将自定义数据类型定义为类,就像任何 OO 语言一样,但您可能不应该为简单的数据类型(例如特定类型的数字)执行此操作。
ColdFusion 中的类型是一个灰色区域。这是一个字符串。它是一个整数。它可以是一个 bool 值。有些简单的类型你不能乱用,但会直接输出到屏幕/页面/缓冲区/任何东西,然后有复杂的类型,如数组、结构和查询,以及可以使用 <cfdump>
和 CFC 可视化的类型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 的父类(super class)型中,以便它可以验证自身。
这只是一个想法。剥皮和验证字段的方法有很多。另一个不错的选择是尝试 ValidateThis framework,它将为您设置一个已经为您编写的良好模式和代码。
关于coldfusion - 定义自定义数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48526112/