Yii开发Restful风格的接口,Url中如果需要带上资源的ID,对于自定义主键应该如何处理

2 篇文章 0 订阅
1 篇文章 0 订阅

Yii创建Restful风格的接口之后,我们就可以像这样获取相关的资源了

GET http://localhost:8080/users:逐页列出所有用户;
HEAD http://localhost:8080/users:显示用户列表的概要信息;
POST http://localhost:8080/users:创建一个新用户;
GET http://localhost:8080/users/123:返回用户为 123 的详细信息;
HEAD http://localhost:8080/users/123:显示用户 123 的概述信息;
PATCH http://localhost:8080/users/123 和 PUT /users/123:更新用户 123;
DELETE http://localhost:8080/users/123:删除用户 123;
OPTIONS http://localhost:8080/users:显示关于末端 /users 支持的动词;
OPTIONS http://localhost:8080/users/123:显示有关末端 /users/123 支持的动词。

比如,我们想获取某一个用户的信息,就可以用GET方法请求这个url
GET http://localhost:8080/users/123
这里的123就是用户的ID
默认情况下,ID是整型的。
但是,如果我们修改了user这个model主键

  public static function primaryKey()
    {
        return ['guid'];
    }

我们通过在model中重写primaryKey方法,把主键改成了guid,
假如现在有一个用户的guid是db4c26ba-9862-4299-b51a-8ee08510493f
我们可以这样访问
GET http://localhost:8080/users/db4c26ba-9862-4299-b51a-8ee08510493f
结果会抛出一个"page no found"的异常。原因就是url没有成功匹配正则表达式。

我们可以看一下Yii/rest/UrlRule的源码中有一个属性token

class UrlRule extends CompositeUrlRule
{
   
    /**
     * @var array list of tokens that should be replaced for each pattern. The keys are the token names,
     * and the values are the corresponding replacements.
     * @see patterns
     */
    public $tokens = [
        '{id}' => '<id:\\d[\\d,]*>',
    ];
    ///..............................................................
 }

这个token就是用来匹配url中的主键值的正则表达式,我们发现,这里只匹配整型。而我们的guid是字符串型的,所以我们需要修改这个$tokens。我们直接在这里改了也是可以的,但是,我们用Yii开发要遵循一个原则就是,永远不要修改它的源码。更何况,我们有更好的方法。
那就是在配置文件config/web.php中来修改,看代码

        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules'=>[        
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => 'user',         
                    'tokens'=>[ '{id}' => '<id:[^\\s/]+>']
                ]
            ]

我们在rules中设置了一个tokens ,这个$tokens的值在程序执行的时侯就会取代原先的tokens的值。
所以,现在我们在浏览器中输入
GET http://localhost:8080/users/db4c26ba-9862-4299-b51a-8ee08510493f
就可以返回数据了,当然,前提是有数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值