Heim >PHP-Framework >Laravel >So verbergen Sie API-Felder in Laravel dynamisch

So verbergen Sie API-Felder in Laravel dynamisch

藏色散人
藏色散人nach vorne
2021-03-24 17:38:382282Durchsuche

In der folgenden Tutorial-Kolumne von laravel erfahren Sie, wie Sie API-Felder in Laravel dynamisch ausblenden. Ich hoffe, dass es für Freunde in Not hilfreich ist!

So verbergen Sie API-Felder in Laravel dynamisch

API-Felder in Laravel dynamisch ausblenden

Ich habe kürzlich eine Frage in der Laravel Brasil-Community gesehen, die sich als interessanter herausstellte, als sie aussieht. Stellen Sie sich vor, Sie haben eine UsersResource mit Folgendem implementiert: UsersResource 用下面的实现:

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class UsersResource extends Resource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            &#39;id&#39; => $this->id,
            'name' => $this->name,
            'email' => $this->email
        ];
    }
}

出于某种原因,您可能希望在另一个端点上重新使用该资源类,但隐藏email 字段。这篇文章就是告诉你如何实现这一点的。
如果你不知道  API Resources 是什么,请查看我之前关于这个的文章。

  • First Impression on API Resources
  • API Resources with Nested Relationship

1- 初始化项目

有趣的东西从第3节开始.

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- 控制器

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

<?php
namespace App\Http\Controllers;
use App\Http\Resources\UsersResource;
use App\User;
class UsersController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @param User $user
     * @return \Illuminate\Http\Response
     */
    public function index(User $user)
    {
        return UsersResource::collection($user->paginate())->hide(['id', 'email']);
    }
    /**
     * Display a user.
     *
     * @param User $user
     * @return \Illuminate\Http\Response
     */
    public function show(User $user)
    {
        return UsersResource::make($user)->hide(['id']);
    }
}

为了达到这个目的,我们需要 UsersResourceCollectionUsersResource 同时知道如何处理  hide 调用。

4-  UsersResource 类

让我们从  show 方法开始.  UsersResource::make 将会返回  UsersResource 的对象. 因此,我们应该揭开  hide 的神秘面纱,它可以存储我们期望从响应中移除的键.

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class UsersResource extends Resource
{
    /**
     * @var array
     */
    protected $withoutFields = [];
   
     /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->filterFields([
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email
        ]);
    }
    /**
     * Set the keys that are supposed to be filtered out.
     *
     * @param array $fields
     * @return $this
     */
    public function hide(array $fields)
    {
        $this->withoutFields = $fields;
        return $this;
    }
    /**
     * Remove the filtered keys.
     *
     * @param $array
     * @return array
     */
    protected function filterFields($array)
    {
        return collect($array)->forget($this->withoutFields)->toArray();
    }
}

大功告成! 现在我们可以访问 http://api.dev/api/users/1 ,你会发现响应中已经没有id 字段了。

{
 "data": {
  "name": "Mr. Frederik Morar",
  "email": "darryl.wilkinson@example.org"
 }
}

5-  UsersResourceCollection 类

执行项目集合中的 index 方法, 我们需要作出如下修改:

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

关于 (1), 我们只需要重写  UsersResource 中的 collection 方法

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class UsersResource extends Resource
{
    public static function collection($resource)
    {
        return tap(new UsersResourceCollection($resource), function ($collection) {
            $collection->collects = __CLASS__;
        });
    }
    
    /**
     * @var array
     */
    protected $withoutFields = [];
    /**
     * Transform the resource into an array.
     * 将资源转换为一个数组
     * 
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->filterFields([
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email
        ]);
    }
    /**
     * Set the keys that are supposed to be filtered out.
     *  设置需要隐藏过滤掉的键
     *  
     * @param array $fields
     * @return $this
     */
    public function hide(array $fields)
    {
        $this->withoutFields = $fields;
        return $this;
    }
    /**
     * Remove the filtered keys.
     * 删除隐藏的键
     * 
     * @param $array
     * @return array
     */
    protected function filterFields($array)
    {
        return collect($array)->forget($this->withoutFields)->toArray();
    }
}

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

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UsersResourceCollection extends ResourceCollection
{
    /**
     * @var array
     */
    protected $withoutFields = [];
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->processCollection($request);
    }
    public function hide(array $fields)
    {
        $this->withoutFields = $fields;
        return $this;
    }
    /**
     * Send fields to hide to UsersResource while processing the collection.
     *  将隐藏字段通过 UsersResource 处理集合
     * 
     * @param $request
     * @return array
     */
    protected function processCollection($request)
    {
        return $this->collection->map(function (UsersResource $resource) use ($request) {
            return $resource->hide($this->withoutFields)->toArray($request);
        })->all();
    }
}

就是这么简单! 现在我们访问 http://api.dev/api/users  看到返回结果中没有了 id 和 email 字段了如在 UsersController 中的指定方法 .

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

6- 总结

本文目标是让Resource类通过隐藏一些在其他接口允许暴露的字段从而变得更加灵活。例如当我们请求/users接口时响应的数据是不包含avatar字段的,但是当请求/users/99时响应的数据里包含avatarrrreee

Aus irgendeinem Grund möchten Sie diese Ressourcenklasse vielleicht auf einem anderen Endpunkt wiederverwenden, aber das Feld email ausblenden. In diesem Artikel erfahren Sie, wie Sie dies erreichen.
Wenn Sie nicht wissen, was API-Ressourcen ist, lesen Sie bitte meinen vorherigen Artikel dazu.

  • Erster Eindruck zu API-Ressourcen
  • API-Ressourcen mit verschachtelter Beziehung

1 – Initialisierungsprojekt

Interessante Dinge beginnen mit Abschnitt 3.
rrreee
Bearbeiten Sie die Datei .env, entfernen Sie die Datenbankeinstellungen und fahren Sie mit der Einrichtung des Projekts mit SQLite fort
rrreee

rrreee

2- Routing

Stellen Sie sicher, dass Sie eine Route in der Datei api.php erstellen.

rrreee

3- Controller

Der Controller repräsentiert das gewünschte Ziel. Nehmen wir in diesem Beispiel an, dass wir in der Benutzerliste nur die Namen aller Benutzer sehen möchten und in der Benutzeranzeige nur die E-Mail-Adressen ausblenden möchten.
rrreee🎜Um dies zu erreichen, benötigen wir UsersResourceCollection und UsersResource, um auch zu wissen, wie hide-Aufrufe verarbeitet werden. 🎜

4- UsersResource-Klasse

🎜Beginnen wir mit der Methode show, die das Objekt UsersResource zurückgibt. Daher sollten wir hide entmystifizieren, in dem die Schlüssel gespeichert sind, die wir aus der Antwort entfernen möchten. 🎜rrreee🎜Fertig! , werden Sie feststellen, dass die Antwort kein Feld id enthält. 🎜rrreee

5- UsersResourceCollection-Klasse

🎜Um die index-Methode in der Projektsammlung auszuführen, müssen wir die folgenden Änderungen vornehmen:🎜
  • (1) Stellen Sie sicher UsersResource ::collection Gibt die UsersResourceCollection-Instanz zurück
  • (2) Macht die hide-Methode für UsersResourceCollection verfügbar
  • (3) Übergeben Sie versteckte Felder an UsersResource
🎜Über (1) müssen wir nur UsersResource umschreiben collection-Methode 🎜rrreee🎜 In Bezug auf (2) und (3) müssen wir die UsersResourceCollection-Datei ändern und die Methode hide verfügbar machen Feldhandling sammeln. .🎜rrreee🎜So einfach ist das! Jetzt besuchen wir http://api.dev/api/users und sehen, dass id und email-Felder sind wie in <code>UsersController angegeben.🎜rrreee

6- Zusammenfassung

🎜Das Ziel dieses Artikels ist es, die Ressource Klasse verbirgt einige der anderen Schnittstellen, die offengelegte Felder ermöglichen und dadurch flexibler werden. Wenn wir beispielsweise die Schnittstelle /users anfordern, enthalten die Antwortdaten nicht das Feld avatar, aber wenn wir die Schnittstelle /users/99anfordern > Schnittstelle, die Antwortdaten enthalten das Feld avatar. 🎜🎜Ich empfehle nicht, API-Ressourcen übermäßig oft anzufordern, da dies einfache Dinge wahrscheinlich komplizierter macht. Daher ist es eine einfachere und sinnvollere Lösung, bestimmte Felder beim Anfordern auszublenden. 🎜🎜🎜🎜🎜Empfohlen: 🎜Die neuesten fünf Laravel-Video-Tutorials🎜🎜🎜🎜

Das obige ist der detaillierte Inhalt vonSo verbergen Sie API-Felder in Laravel dynamisch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen