动态隐藏 API 字段— Laravel 5.5

动态隐藏 API 字段— Laravel 5.5

原文:https://medium.com/hackernoon/hiding-api-fields-dynamically-laravel-5-5-82744f1dd15a

我最近在 Laravel Brasil 社区上看到一个问题,这个问题比看起来有趣多了。假设您有一个具有以下实现的UsersResource:

出于某种原因,您可能希望在另一个端点上重用该资源类,但是隐藏 email 字段。这篇文章是如何实现这一目标的方法。

如果您不知道什么是 API 资源,可以查看我以前关于这个主题的文章。

1-设置项目

有趣的事情从第三节开始。

composer create-project --prefer-dist laravel/laravel api-fields
cd api-fields
touch database/database.sqlite

编辑您的.env文件以删除数据库设置并使用 SQLite

DB_CONNECTION=sqlite

继续设置项目

php artisan migrate
php artisan make:resource UsersResource
php artisan make:resource --collection UsersResourceCollection 
php artisan make:controller UsersController
php artisan tinker
factory(App\User::class)->times(20)->create();
quit

2-路线

确保在api.php文件中创建一条路线。

Route::*apiResource*('/users', 'UsersController');

3-控制器

控制器代表期望的目标。在这个例子中,我们假设在清单中我们只想要所有用户的名字,而在显示中我们只想要隐藏电子邮件地址。

为了实现这一点,我们需要我们的UsersResourceCollectionUsersResource都知道如何处理hide呼叫。

4-用户资源类

先说show法。UsersResource::make将返回一个UsersResource的对象。因此,我们应该公开一个方法hide,该方法存储需要从响应中删除的键。

搞定了。此时,我们应该能够在没有id字段的情况下访问http://api.dev/api/users/1和阿瑟响应。

{
 "data": {
  "name": "Mr. Frederik Morar",
  "email": "[[email protected]](mailto:[email protected])"
 }
}

UsersResourceCollection 类

对于使用index方法的项目集合,我们需要执行一些更改:

  • (1)确保UsersResource::collection返回UsersResourceCollection的实例
  • (2)在UsersResourceCollection上暴露hide方法
  • (3)将隐藏字段传递到UsersResource

对于(1),我们只需要覆盖UsersResource上的collection方法

对于(2)和(3),我们需要改变UsersResourceCollection文件。让我们公开hide方法并用隐藏字段处理集合。

就是这样!现在,如果我们调用http://api.dev/api/users,我们可以看到一个没有像指定的UsersController那样的idemail字段的响应。

{
 "data": [{
  "name": "Mr. Frederik Morar"
 }, {
  "name": "Angel Daniel"
 }, {
  "name": "Brianne Mueller"
 }],
 "links": {
  "first": "[http://lab.php71/api-fields-2/public/api/users?page=1](http://lab.php71/api-fields-2/public/api/users?page=1)",
  "last": "[http://lab.php71/api-fields-2/public/api/users?page=7](http://lab.php71/api-fields-2/public/api/users?page=7)",
  "prev": null,
  "next": "[http://lab.php71/api-fields-2/public/api/users?page=2](http://lab.php71/api-fields-2/public/api/users?page=2)"
 },
 "meta": {
  "current_page": 1,
  "from": 1,
  "last_page": 7,
  "path": "[http://api-fields.lab.php71/api/users](http://lab.php71/api-fields-2/public/api/users)",
  "per_page": 3,
  "to": 3,
  "total": 20
 }
}

6-结论

目标是通过允许隐藏另一个端点可能暴露的一些字段,使Resource类稍微灵活一些。这种实现的一个实际例子是不包含avatar属性的/users端点,但是当通过/users/99请求特定用户时,我们可能希望在响应中包含avatar

我不建议过多地重用 API 资源,因为这很容易增加本应简单的层的复杂性。也就是说,考虑到实现的简单性,隐藏列表请求和特定记录之间的某些特定字段看起来确实是一个合理的请求。

7-接下来是什么

在下一篇文章中,我将尝试将hide方法提取到一个特征中,并使它在所有 API 资源中可重用。请在 Medium 上关注我,敬请关注!


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除