体验发布< titlesplit >在阿北的知识分享小程序中,安心使用。大家知道,我最近正在改版“阿北的知识分享”微信小程序。我在yii2中使用restful函数。接下来,我将描述我遇到的一些问题。和分享技巧。先安利小程序代码链接开始分享。需要重写URL。我们知道restful风格的URL一般是GET/usersPOST/usersDELETE/users/1。我们yii2默认的URL格式是index.php?r=controller/action。虽然yii2已经提供了专门针对restful的路由规则,但是我们还是需要服务器支持url重写来去掉index.php。我使用nginx,配置位置如下/{if(!-e$request_filename){rewrite^/(.*)/index.phplast;}}如果你的是apache,可以这样配置//Apache需要支持url重载把它的AllowOverride写成allAllowOverride:all//在web目录下添加.htaccess,隐藏index.php文件内容如下:RewriteEngineonRewriteCond%{REQUEST_FILENAME}!-fRewriteCond%{REQUEST_FILENAME}!-dRewriteRule。REQUEST_FILENAME}!-fRewriteCond%{REQUEST_FILENAME}!-dRewriteRule^(.*)\?*$index.php/$1[L,QSA]不要DELETE默认yii2的restful已经提供了index,view,update,createdelete和delete一共5个action,用来满足对资源的不同行为。也许您不需要在界面中删除。有两种方法可以在url规则中配置(推荐)。比如我不想打开DELETE/users/1,你可以这样配置相应的url规则['class'=>'yii\rest\UrlRule','controller'=>'user','except'=>['delete']],rewriteaction我们知道这些内置方法都是使用actions方法实现的,我们可以重写这个函数。类UserController扩展ActiveController{public$modelClass='app\models\User';publicfunctionactions(){$actions=parent::actions();取消设置($actions['delete']);返回$动作;}。..}两种方法都可以实现但是返回的结果不同。感兴趣的同学可以自行体验。添加一个名为abc的内置方法就可以满足很多。要求太复杂了。我想在控制器中添加一个actionAbc方法。如何配置?看下面的代码,还是在urlManager中完成的。['class'=>'yii\rest\UrlRule','controller'=>'user','except'=>['delete','update','index'],'extraPatterns'=>['POSTabc'=>'abc',]],这样就可以通过POST/users/abc调用User控制器的abcAction。我想要更多数据。我想通过GET/users获取会员的id和昵称字段。在get参数中传递fields='id,nickname'就很简单了。这很容易。毕竟id和nickname是user表的列,但是我也想获取每个会员下的订单数,但是订单数不属于user表。添加get参数的方法如下。我们需要添加一个名为expand的参数。值为你要获取的字段名,以逗号分隔。GET/users?fields='id,nickname'&expand='oTotal'要配置用户模型,我们需要重写一个方法叫extraFieldspublicfunctionextraFields(){return['oTotal'];}写具体逻辑接下来我们将在User模型中写一个实现oTotal的函数publicfunctiongetOTotal(){returnOrder::find()->where(['user_id'=>$this->id])->count();}什么你找到了吗?还记得yii2中有个叫association的概念吗,是不是觉得获取多条数据很简单?为什么json生病了?使用小程序发起服务器请求,比如创建一本新书,我们一般喜欢这样写代码wx.request({method:'POST',data:{name:name},url:app.globalData.remoteUrl+'/books',header:{'content-type':'application/json'},success:function(res){}})这里我设置了'content-type':'application/json',问题发生了,服务器端获取不到json中的name值。这很简单。yii2的restful默认不支持请求中json的数据解析。幸运的是,它可以通过一些配置来完成。//config/web.php'components'=>['request'=>['cookieValidationKey'=>'','parsers'=>['application/json'=>'yii\web\JsonParser',]],]只需添加一个JsonParser解析器。认证问题网页上有登录,restful上没有session。没关系,我们可以使用访问令牌来修复它。配置非常简单。例如,我现在要求必须在登录后访问GET/users。配置用户模型和表首先为用户表配置一个access_token字段,在用户模型该方法主要用于生成access_token值。当然我们的User模型需要实现yiiwebIdentityInterface接口,否则无法使用Yii::$app->user访问。关于IdentityInterface,我想这里对于yii2登录已经很熟悉了。记住如果restful认证生效,必须实现下面的方法])->一个();return$model;}到这里User模型配置好了。小提示:如果想在登录的瞬间做点什么,也可以放在findIdentityByAccessToken中,比如记录登录时间什么的。配置动作接下来,我们来限制特定接口的认证和覆盖行为,如下publicfunctionbehaviors(){$behaviors=parent::behaviors();$behaviors['contentNegotiator']['formats']=['application/json'=>Response::FORMAT_JSON];$behaviors['authenticator']=['class'=>HttpBearerAuth::className(),'only'=>['index'],];返回$行为;}}这样就搞定了,我们这里使用HttpBearerAuth认证,就是在请求的header中写上Authorization,Yii2的restful也支持其他的。请记住,身份验证过程是自动的,我们可以在身份验证方法中使用Yii::$app->user->id来获取当前成员的ID。列表中的更多参数我们知道可以通过GET/users获取成员列表,但是你可能会说我想从微信平台获取成员(user表中有一个字段plat代表来源平台),what我应该怎么做?我们需要重写接口并接受plat参数。首先在User控制器中设置一个新的prepareDataProvider函数,用于接收参数和生成成员列表数据,并返回一个ActiveDataProvider结果集。namespaceapp\modules\xcx\controllers;useYii;useyii\rest\ActiveController;....classUserControllerextendsActiveController{public$modelClass='app\models\User';publicfunctionactions(){$actions=parent::actions();$actions['index']['prepareDataProvider']=[$this,'prepareDataProvider'];返回$动作;}publicfunctionprepareDataProvider(){$params=Yii::$app->request->queryParams;$modelClass=$this->modelClass;$query=$modelClass::find()->where(['plat'=>$params['plat']]);$provider=newActiveDataProvider(['query'=>$query->orderBy(['created_at'=>SORT_DESC])]);返回$提供者;}}首先通过$actions['index']['prepareDataProvider']=[$this,'prepareDataProvider']告诉yii2我要自定义获取结果集的方法,然后定义这个方法。在prepareDataProvider中,可以通过Yii::$app->request->queryParams接收get参数的值。总结以上就是目前使用yii2的restful开发小程序时用到的一些知识和技巧。希望对你有用,以后有的话会分享的。
