Yii2 REST API按字段查找
这是api url /api/web/v1/users/123 按id查找用户。如何将规则更改为按Yii2 REST API按字段查找,yii2,yii-rest,Yii2,Yii Rest,这是api url /api/web/v1/users/123 按id查找用户。如何将规则更改为按令牌,而不是按id查找 这里有一条规则: [ 'class' => 'yii\rest\UrlRule', 'controller' => ['v1/users'], 'tokens' => [ '{id}' => '
令牌
,而不是按id
查找
这里有一条规则:
[
'class' => 'yii\rest\UrlRule',
'controller' => ['v1/users'],
'tokens' => [
'{id}' => '<id:\\w+>'
// this does not work
// '{token}' => '<token:\\w+>'
],
],
[
'class'=>'yii\rest\UrlRule',
“控制器”=>[“v1/用户”],
“代币”=>[
“{id}”=>”
//这行不通
//“{token}”=>”
],
],
定义为令牌的{id}
是内置代码所使用的令牌:
class ViewAction extends Action
{
/**
* Displays a model.
* @param string $id the primary key of the model.
* @return \yii\db\ActiveRecordInterface the model being displayed
*/
public function run($id)
{
$model = $this->findModel($id);
if ($this->checkAccess) {
call_user_func($this->checkAccess, $this->id, $model);
}
return $model;
}
}
$this->findModel($id)
在下定义,它使用主键查找模型。如果需要使用不同的令牌(如{token}
),并在与其主键不同的属性中查找模型,则需要覆盖控制器内的视图操作
下面是一个将'{token}'=>'
添加到规则中时应该可以使用的示例:
class UserController extends ActiveController
{
...
public function actions()
{
$actions = parent::actions();
unset($actions['view']);
return $actions;
}
public function actionView($token){
$modelClass = $this->modelClass;
$model = $modelClass::find()->where(['token' => $token])->one();
if ($model === null)
throw new \yii\web\NotFoundHttpException("Uknown user having $token as token");
return $model;
}
}
还要注意的是,您将需要更改以支持新的inroduced版本。您的最终规则可能如下所示:
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => ['v1/users'],
'tokens' => [
'{id}' => '<id:\\w+>',
'{token}' => '<token:\\w+>'
]
'patterns' => [
'PUT,PATCH {id}' => 'update',
'DELETE {id}' => 'delete',
// {token} is assigned to $token when redirecting to view
'GET,HEAD {token}' => 'view',
'POST' => 'create',
'GET,HEAD' => 'index',
'{id}' => 'options',
'' => 'options',
],
],
]
“规则”=>[
[
'class'=>'yii\rest\UrlRule',
“控制器”=>[“v1/用户”],
“代币”=>[
“{id}”=>”,
“{token}”=>”
]
“模式”=>[
'PUT,PATCH{id}'=>'update',
'DELETE{id}'=>'DELETE',
//重定向到视图时,{token}被分配给$token
'GET,HEAD{token}'=>'view',
“发布”=>“创建”,
'GET,HEAD'=>'index',
“{id}”=>“选项”,
''=>'选项',
],
],
]
现在我有了错误的请求。缺少必需的参数:令牌
。如果在规则404中启用{token}=>
。怎么了?我刚刚更新了。这是因为默认情况下,模式使用的是'GET,HEAD{id}'=>'view'
。你需要改变它。非常感谢@Salem Ouerdani