Services 3.x operations和actions的区别

本文来自Q群的一次关于这个话题的讨论,因为很多人都搞不清楚这个,所以总结发布在本站。

Services模块一共有4种类别的资源操作,operations, actions, relationships, target_actions。

其中operations用于定义标准的CRUD,具体来说,里面定义的是create, retrieve, update, delete。但这个不是必须存在的,因为你定义的资源类型可能对你的网站来说不一定真的是有意义的资源,一个例子就是flag,flag只是一些对核心类型的投票,因此flag的资源类型不需要具备CRUD方法。

actions用于定以不针对任何具体资源的操作,比如,user_login, user_logout。

relationships用于定义获取具体资源的关联信息,比如,node/1/files, node/1/revisions。

target_actions用于定义针对具体资源的非标准CRUD的方法,比如,node/1/publish。

因此,我们定义的任何一个REST API,都可以根据以上规则,在定义hook_services_resources时,分别将操作定义到不同的API类别中。

另外,分发逻辑是定义在 services 模块的 rest_server 子模块的 RESTServer.inc 的 resolveController 方法中的,可以看出,除了针对不同的HTTP头(GET,PUT, POST, DELETE)来做不同的分发以外,还会判断参数的个数是否匹配,意思是在调用的时候,如果发现传的参数的个数明显不符合定义的参数的个数,即使方法名存在也不会成功调用,会返回404。看了这个文件的代码就会基本弄明白services模块的原理。