RESTful 项目中,内部函数如何更方便的调用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
blue7wings
V2EX    PHP

RESTful 项目中,内部函数如何更方便的调用?

  •  
  •   blue7wings 2015-08-19 22:52:40 +08:00 4007 次点击
    这是一个创建于 3709 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在项目所用的是 RESTful 风格开发,也就是全部都是 api 路由绑定对应的控制器。现在就有一个问题,例如在 A 控制器中,想要调用 B 控制器中的中的某个方法来完成一定的逻辑,由于控制器方法绑定路由,参数的接受方式全都是$_POST 或者$_GET 的方式获得的,所以我只能通过模拟 POST 或 GET 请求,走路由,然后才能调用到该方法。


    • 请求在内部走了一圈,是不是没有直接调用数效率高呢?现在项目就已经出现变慢的情况
    • 有没有什么优雅的方法能解决这个问题?
    10 条回复    2015-09-10 14:12:37 +08:00
    xupefei
        1
    xupefei  
       2015-08-19 23:04:34 +08:00
    写一个公用函数, A 和 B 都去调用它。
    luban
        2
    luban  
       2015-08-20 00:11:41 +08:00 via Android
    b 控制器中不该有太多方法的实现,你该独立出一个 service 层,等等, service 不该操作数据库,你该独立出一个 dao 层,等等, JAVA 为什么要这么多层
    iyaozhen
        3
    iyaozhen  
       2015-08-20 00:19:36 +08:00
    我觉得你应该分一下层,数据层控制器 A 、 B 都可以去调用。若是 A 中需要用到 B 中的方法(一般也是处理数据的方法),那么就把这个方法独立出一个库或者辅助函数。
    matrixyuri
        4
    matrixyuri  
       2015-08-20 00:47:10 +08:00
    @luban
    这个方法其实蛮好的,我目前框架里就是引入了这个思想,
    分 Action (Controller ), Service, Data, View 四层,

    其中 Service 和 Data 合起来就是原本的 Model 层。
    Service 层负责封装 Data 层,
    Data 层负责原子性的数据增删改查,或者是获取网络内容什么的,互相之间杜绝相互调用。

    具体的需求实现在 Service 里完成, Action 层只负责输入输出的校验逻辑,已经调用 Service 层函数。

    我自己做的框架 [Vera]( https://github.com/MatrixYuri/Vera ) 欢迎 Fork 欢迎 PR 欢迎 Star~
    dododada
        5
    dododada  
       2015-08-20 14:59:05 +08:00
    mvc 很多年了
    blue7wings
        6
    blue7wings  
    OP
       2015-08-20 23:35:21 +08:00
    @luban
    @matrixyuri

    把一定的功能实现放到 service 层去,那么控制器中应该抽象到什么程度,把 Request 请求的数据处理,然后数据的输出放在控制器中,中间所有的逻辑都放到了 service 中去,这样合不合理呢?
    matrixyuri
        7
    matrixyuri  
       2015-08-21 02:47:48 +08:00
    @blue7wings
    就是你说的这样,把业务逻辑都放在 Service 里边, Controller 里边只做输入输出的校验容错。

    这样的话,接口这里比较灵活,可以同一功能、根据不同的输入对应到不同的 URL 上。
    另外对实现需求也比较灵活,比如今天 PM 说要有一个查看学生成绩的功能,就通过 Service 调取对应的 Data 层方法,汇总得到学生的成绩;明天 PM 说要把学生和老师对应起来,这时就可以复用昨天的 Data 层方法,在新的 Service 中融合进来老师的 Data 层数据,按照要求实现新的汇总数据。

    简单的说就是把需求拆成独立的互不干扰的小功能点,便于之后根据新的需求进行组装。
    这个思路目前一直在用,觉得挺好使的,可以轻松应对善变的 PM ,不容易出人命:)
    blue7wings
        8
    blue7wings  
    OP
       2015-08-21 09:13:06 +08:00
    @matrixyuri 谢谢你的回复,学到了。。
    that24
        9
    that24  
       2015-09-09 22:40:03 +08:00
    @matrixyuri 请教下 Service 里面的版本怎么控制呢?比如 /v1/user/:id 调用 Service 里面的 User 类中的 Info 方法,当现在变成 V2 时如何控制比较好?
    matrixyuri
        10
    matrixyuri  
       2015-09-10 14:12:37 +08:00
    @that24
    如果业务逻辑方面没变化,就可以复用原本的 Service ,
    如果有变化,就实现一个新的 Service ,通过新的 Controller 调用。

    命名的话,可以考虑 Service_Aa 作为 v1 , Service_Ab 作为 v1.1 , Service_Ba 作为 v2 这样。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4589 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:05 PVG 12:05 LAX 21:05 JFK 00:05
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86