marslu 2019-03-21 18:51:47 2506次浏览 6条回复 1 4 0

使用 Yii2 做 restful 接口,大家都知道Yii默认的路由规则会自动识别url的名词改为负数形式。

如果你的rules是这样配置的

'rules' => [
     ['class' => 'yii\rest\UrlRule', 'controller' => 'v1/tag'],
]

你的控制器是TagController,假如要获取所有的tag列表,你的URL需要是这样的 http://restful-lc.com/v1/tags,然后你如期得到了所有的tag列表。

这只是Yii的基础知识,就不做过多的解读,接下来坑来了...

假如你有一张表叫Hero,你的控制器是HeroController,现在你想获取所有的hero列表,你会怎么访问这个接口?

'rules' => [
    ['class' => 'yii\rest\UrlRule', 'controller' => ['v1/tag', 'v1/hero']],
]

你顺手写下了这样的URL请求 http://restful-lc.com/v1/heros,然后发送,然后你得到了这样的响应。

404

what ???

懵逼t

这是为什么呢?

难道hero是什么关键字? 不可能,这哥们不像。 难道是表不存在? 不可能,都是gii自动生成的。

于是你继续测试,你又新建了一个控制器是ChipController,表名chip,然后访问http://restful-lc.com/v1/chips,果然又收到了正确的响应结果,返回了chip列表。

然后如法炮制,你又新建了一个控制器是TechController,表名tech,然后访问http://restful-lc.com/v1/techs,然后又是这样的响应。

404

...

这是不是不太科学,在你一筹莫展、抽了三根烟、头发要掉光的时候,你忽然想起你的小学英语老师教你的的英语语法知识,ch结尾的名词复数形式是不是一般加es,比如match --> matches,以o结尾的单词的复数好像也是加es

然后你抱着你访问了http://restful-lc.com/v1/heroes,果然你得到了正确的数据列表。

alt text

这...

Yii好牛逼啊,于是你追下框架源码

alt text

alt text

然后你就看到了这行代码

alt text

原来Yii做了简单的规则匹配,hero被换成了heroes。

真像大白,看来程序员不会点基本的语法,还真写不了代码了,哈哈。

如果你不想这样猜来猜去,你可以把pluralize参数的值设置为false,代表Yii不会帮我们做自动复数处理,你可以直接用http://restful-lc.com/v1/hero访问获取结果。

最后放上一个英文单数变复数的链接供大家学习 英语单词在使用复数的时候什么时候加S 什么时候es

无耻的推广下Yii2写的技术论坛https://www.shiqidu.com

觉得很赞
  • 回复于 2019-03-22 09:10 举报

    以前也碰到过,活动activity,加上s怎么都得不到,试了半天才出来

    1 条回复
    回复于 2019-03-24 19:22 回复

    搞了好久,最后猛然发现是不是因为【语法】的原因,一试还真是。

  • 回复于 2019-03-22 09:51 举报

    我滴个神咯,这么牛逼的嘛

    1 条回复
    回复于 2019-03-24 19:21 回复

    是啊,对于英语不好的学渣真的太伤。

  • 回复于 2019-03-27 12:19 举报

    有意思...........

  • 回复于 2019-03-27 17:44 举报

    厉害了。。。。。。。。

    1 条回复
    回复于 2019-04-03 14:19 回复

    哈哈,有点坑

  • 回复于 2019-04-01 13:52 举报

    如果是我,绝对不会想到是自然语法的问题,绝壁要在框架里面钻好几天,找框架问题

    1 条回复
    回复于 2019-04-03 14:19 回复

    其实如果追一追代码,也能很快发现问题。

  • 回复于 2019-04-25 10:04 举报

    哈哈,厉害了

您需要登录后才可以回复。登录 | 立即注册