之前我们已经准备好了基本的安装过程。下面我们在具体的业务部分实现用户的登录和注册。对于用户注册,这对于应用程序来说是正常的。对于我们接下来的效果,我们可以生成一个UserController,即在项目终端执行$phpartisanmake:controllerApp\\Api\\Controllers\UserController来生成用户。我们暂时不会编辑字段。后面我们需要使用之前创建的LessonModel时,会返回字段数据。这里我们首先在routes/api中添加我们的基础路由Route::middleware('auth:api')->get('/user',function(Request$request){return$request->user();})。php;$api=app('Dingo\Api\Routing\Router');$api->version('v1',function($api){$api->group(['namespace'=>'App\Api\Controllers'],function($api){$api->get('lessons','LessonsController@index');$api->get('lessons/{id}','LessonsController@show');});});我们先访问这个http://host/api/lessons来完成controller的相关方法publicfunctionindex(){$lessons=Lesson::all();returnresponse()->json($data);}这样简单的返回了Lessons的所有字段信息,但是我们可以看到所有的字段信息都已经返回了,但是这时候有个问题就是我们的字段无法返回完整的,我们肯定会返回一些被过滤的字段。这使用了我们之前创建的Transformers文件。话不多说,在App/Api/Transformers目录下新建一个LessonTran前者使用App\Lesson;使用League\Fractal\TransformerAbstract;类LessonTransformerextendsTransformerAbstract{publicfunctiontransform(Lesson$lesson){return['title'=>$lesson['title'],'content'=>$lesson['body'],'is_free'=>(boolean)$lesson['free']];}}这样我们就实现了字段数据的映射,然后去LessonController中映射前面所有的字段publicfunctionindex(){$lessons=Lesson::all();return$this->collection($lessons,newLessonTransformer());}当然,要实现这个集合,我们需要用到Dingo提供的Helperstrait。继承的基类可以这样写useDingo\Api\Routing\Helpers;classControllerextendsBaseController{useHelpers,AuthorizesRequests,DispatchesJobs,ValidatesRequests;}这样我们只返回标题内容is_free这三个字段。同样如果我们想获取其中一条数据,我们也可以映射publicfunctionshow($id){$lesson=Lesson::find($id);if(!$lesson){return$this->response()->errorNotFound("Lessonntfound");}返回$this->response()->item($lesson,newLessonTransformer());}这里我使用了Dingo提供的return方法。如果没有该数据,则返回404和相应的错误信息。下面是auth认证结合jwt。我们在App\Api\Controllers目录下新建一个AuthController。这里需要写我们的认证方法和获取认证用户的方法。创建一个新的身份验证publicfunctionauthenticate(Request$request){//从请求中获取凭证$credentials=$request->only('email','password');try{//尝试验证凭证并为用户创建令牌if(!$token=JWTAuth::attempt($credentials)){returnresponse()->json(['error'=>'invalid_credentials'],401);}}catch(JWTException$e){//尝试对令牌进行编码时出现错误returnresponse()->json(['error'=>'could_not_create_token'],500);}//一切正常所以返回令牌returnresponse()->json(compact('token'));}为了执行这个方法,你可以定义$api->version('v1',function($api){$api->group(['namespace'=>'App\Api\Controllers'],function($api){$api->post('用户/登录','AuthController@authenticate');$api->post('用户/注册','AuthController@register');});});这时候,如果我们再次查看我们的路由,就会看到新定义的post路由。为了验证请求的结果,我们可以使用chrome工具postman请求http://localhost:8000/api/use...这时候是会返回{"error":"invalid_credentials"}为了能够正确通过,我们可以在body部分给用户email和password(用户可以用thinker创建一个),这时候会正确返回一个token。当然,测试的话,可以直接去tinker新建一个用户即可,这里我新建了一个用户,邮箱地址是jellybean@163.com,这样我们就可以拿到用户的token了。我们在集成jwt认证时添加了jwt:auth中间件。这其实很好理解。比如用户没有登录某篇文章,你就不能收集文章的评论等等。那么我们会在用户登录后或者用户注册后,将这个token返回给客户。一个token值,让用户可以用这个token作为证明你是一个登录用户,你是我们网站的用户,所以你可以发表文章等操作,所以我们可以为一些路由添加一些中间件$api->group(['namespace'=>'App\Api\Controllers','middleware'=>'jwt.auth'],function($api){$api->get('lessons','LessonsController@index');$api->get('lessons/{id}','LessonsController@show');});这样的话,如果我们再次访问一节课,会提示我们缺少token,因为现在相当于一个没有登录的用户访问这个路由,那么如果我们去连接我们的token,这会接下来,我们就可以访问相应的数据了。这个令牌也会有过期时间。如果它过期了,我们需要更新令牌。在应用中,我们可以添加一个api_token字段来存储这个字段,这样每次用户访问对应的路由时,我们都会对token进行验证。当然jwt安装成功后,使用默认的auth进行认证,同时读取users表中的数据。如果需要验证其他数据表,可以参考这篇文章。jwt自定义数据表与auth中的users表不同。这样基本实现了一个基本的后台接口的请求流程,可以参考我的博文LaravelAPI开发初探LaravelAPI结合DingoAPI和JWT
