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
就可以返回数据了,当然,前提是有数据。