Yii2 REST API按字段查找

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}' => '

这是api url

/api/web/v1/users/123

按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