当前位置: 首页 > 后端技术 > PHP

使用 Laravel 的 API 资源功能来构建你的 API

时间:2023-03-30 05:25:56 PHP

使用Laravel的API资源功能来构建你的API一直在使用Fractal进行API开发。如果说有一个功能是我最希望Laravel可以加入的,那无疑就是方便数据转换,以便开发出更好的API接口。不要误会我的意思,Fractal非常好用,但我一直希望我只能使用框架进行开发。如果可以的话,我尽量不使用类库!我不喜欢使用第三方库使开发复杂化。最近一年喜欢用Vue、React等一些前端框架来开发。因此,我选择只使用Laravel来构建API接口。而当我需要构建API接口时,Fractal是我首选的类库。现在,情况发生了变化。在Laravel5.5中,我们有API资源,我对此感到非常兴奋。2小时前,Laravel5.5发布了,我正在和朋友喝咖啡。半小时前看到这条推文的时候,我的第一个念头就是利用API资源发表我的第一篇博文,我就这么做了。Laravel的API资源是基于Fractal的,所以我没有花太多时间了解如何使用它。那么,让我们开始吧...创建一个Laravel应用程序使用通常的命令行创建一个Laravel应用程序命令生成Laravel密钥。phpartisankey:generatestartservicephpartisanserve很好,下一步是什么?创建产品资源API资源是Laravel中的一项新功能,可将您的模型和模型集合转换为JSON。接下来让我们创建一个产品资源。phpartisanmake:resourceProduct在app/Http/Resources目录下可以看到刚才生成的Product资源,当然我们还需要Product的数据库迁移,model和controller。我们可以使用此命令快速创建这些。phpartisanmake:modelProduct-mc打开数据库迁移文件,然后像这样修改up方法的内容:publicfunctionup(){Schema::create('products',function(Blueprint$table){$table->increments('id');$table->string('name');$table->integer('price');$table->timestamps();});}注意这里的价格字段是一个整数。我求求你,永远不要将你的价格数据存储在浮点数中!一定要用整数来存储!现在使用Laravel应用程序连接到数据库并运行此迁移以生成表。这篇文章不是Laravel一对一的教程帖子,所以我不会在连接数据库上浪费太多时间。下一个?到目前为止,我们有模型、控制器、数据库迁移和资源类来将模型和模型集合转换为JSON。下一个是什么?在此之前,什么是资源类?那么我们在资源文件夹中创建的Product类呢?资源类表示转换为JSON的单个模型的结构。结合以上,我们打开Product.php资源类文件。这里有一个toArray方法,它返回我们发送响应时需要转换为JSON的属性数组。让我们修复它,以便我们有更好的想法。publicfunctiontoArray($request){return['id'=>$this->id,'name'=>$this->name,'price'=>$this->price,'created_at'=>$this->created_at,'updated_at'=>$this->updated_at,];}现在意味着我们可以获得包含字段id、名称、价格、created_at和updated_at的响应。如果我们删除toArray方法中的价格字段,则返回的JSON中将没有价格。很酷不是吗?使用Product资源我们刚刚更改了toArray方法,让我们继续在我们的控制器中使用 product资源。产品控制器看起来像这样:::查找($id));}}要转换产品,我们只需在产品资源类中传递一个产品。让我们使用show方法创建一个路由并查看结果。打开api.php文件并在中间件之外创建此路由。Route::get('/products/{id}','ProductController@show');现在,手动将新产品添加到您的产品表并访问http://127.0.0.1:8000/api/pro...看一个简单的产品。你应该得到这样的东西:现在让我们稍微修改一下我们的资源,如果你不想公开你的产品的价格,你所要做的就是简单地将它从你的toArray方法中删除。从toArray方法中删除价格后,您应该得到类似这样的结果,当然不包括价格:仅此而已吗?当然不是!因为toArray方法只是一个方法,这意味着您可以包含其他信息。如果我们想包含一条“测试”消息,只需更改您的toArray方法即可。publicfunctiontoArray($request){return['id'=>$this->id,'name'=>$this->name,'test'=>'这只是一个测试','created_at'=>$this->created_at,'updated_at'=>$this->updated_at,];}结果如下:然而,始终希望返回正确的数据类型非常重要。查看第一个屏幕截图中的价格,它返回一个整数,但是对于(int)$this->price,我们仍然必须强制它为一个整数。现在,查看create_at和updated_at时间戳。如果你想要的是返回一个带有实际时间戳的字符串?然后你可以像这个例子一样转换为字符串:publicfunctiontoArray($request){return['id'=>$this->id,'name'=>$this->name,'test'=>'Thisisjustatest','created_at'=>(string)$this->created_at,'updated_at'=>(string)$this->updated_at,];}现在结果是这样的:使用LaravelAPI资源的示例。如果我一直写下去,这篇文章永远写不完。那么,本文就这些了,如您所知,我们还有更多主题要讨论,例如分页、资源集合、关联和数据包装。