LaravelでAPIフィールドを動的に非表示にする方法

藏色散人
リリース: 2021-03-25 09:02:32
転載
2248 人が閲覧しました

laravel の次のチュートリアル コラムでは、Laravel で API フィールドを動的に非表示にする方法を紹介します。

LaravelでAPIフィールドを動的に非表示にする方法

Laravel での API フィールドの動的非表示

最近、Laravel Brasil コミュニティで質問を目にしました。結果は、もっと面白く見えました。次のように実装された

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 リソース
が何かわからない場合は、これに関する私の以前の記事を参照してください。

API リソースの第一印象
  • ネストされた関係を持つ API リソース
  • 1- 初期化プロジェクト

興味深い内容 開始セクション 3.

composer create-project --prefer-dist laravel/laravel api-fields
cd api-fields
touch database/database.sqlite
ログイン後にコピー

.env

ファイルを編集し、データベース設定を削除し、SQLite を使用してプロジェクトのセットアップを続行します<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">DB_CONNECTION=sqlite</pre><div class="contentsignin">ログイン後にコピー</div></div>

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

ファイルにルートを必ず作成してください。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Route::apiResource('/users', 'UsersController');</pre><div class="contentsignin">ログイン後にコピー</div></div>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']);
    }
}
ログイン後にコピー

これを実現するには、

UsersResourceCollection

UsersResource の両方が hide 呼び出しの処理方法を認識している必要があります。 4- UsersResource クラス

show

メソッドから始めましょう。UsersResource::makeUsersResource オブジェクトを返します。したがって、応答から削除したいキーを保存する hide をわかりやすく説明する必要があります。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?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-&gt;filterFields([             'id' =&gt; $this-&gt;id,             'name' =&gt; $this-&gt;name,             'email' =&gt; $this-&gt;email         ]);     }     /**      * Set the keys that are supposed to be filtered out.      *      * @param array $fields      * @return $this      */     public function hide(array $fields)     {         $this-&gt;withoutFields = $fields;         return $this;     }     /**      * Remove the filtered keys.      *      * @param $array      * @return array      */     protected function filterFields($array)     {         return collect($array)-&gt;forget($this-&gt;withoutFields)-&gt;toArray();     } }</pre><div class="contentsignin">ログイン後にコピー</div></div>Done! これで、

http: //api.dev/api/ にアクセスできるようになります。 users/1

の場合、応答に id フィールドがないことがわかります。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">{  &quot;data&quot;: {   &quot;name&quot;: &quot;Mr. Frederik Morar&quot;,   &quot;email&quot;: &quot;darryl.wilkinson@example.org&quot;  } }</pre><div class="contentsignin">ログイン後にコピー</div></div>5- UsersResourceCollection クラス

プロジェクト コレクションで

index

メソッドを実行します。次の変更を行う必要があります:

( 1)
    UsersResource::collection
  • UsersResourceCollection インスタンス (2)
  • UsersResourceCollection# のパブリック
  • hide メソッド # を返すことを確認します。 #(3) 隠しフィールドを UsersResource
  • に渡す (1) については、
  • UsersResource## の
collection を書き換えるだけです。

# メソッド <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?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-&gt;collects = __CLASS__;         });     }          /**      * @var array      */     protected $withoutFields = [];     /**      * Transform the resource into an array.      * 将资源转换为一个数组      *       * @param  \Illuminate\Http\Request      * @return array      */     public function toArray($request)     {         return $this-&gt;filterFields([             'id' =&gt; $this-&gt;id,             'name' =&gt; $this-&gt;name,             'email' =&gt; $this-&gt;email         ]);     }     /**      * Set the keys that are supposed to be filtered out.      *  设置需要隐藏过滤掉的键      *        * @param array $fields      * @return $this      */     public function hide(array $fields)     {         $this-&gt;withoutFields = $fields;         return $this;     }     /**      * Remove the filtered keys.      * 删除隐藏的键      *       * @param $array      * @return array      */     protected function filterFields($array)     {         return collect($array)-&gt;forget($this-&gt;withoutFields)-&gt;toArray();     } }</pre><div class="contentsignin">ログイン後にコピー</div></div> (2) と (3) に関しては、UsersResourceCollection ファイルを変更する必要があります。

hide

メソッドを公開し、隠しフィールドを使用して、コレクションを扱います。 .<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?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-&gt;processCollection($request);     }     public function hide(array $fields)     {         $this-&gt;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-&gt;collection-&gt;map(function (UsersResource $resource) use ($request) {             return $resource-&gt;hide($this-&gt;withoutFields)-&gt;toArray($request);         })-&gt;all();     } }</pre><div class="contentsignin">ログイン後にコピー</div></div> それはとても簡単です! 次に、http://api.dev/api/users にアクセスすると、

id

が含まれていないことがわかります。 email フィールドは、UsersController.<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">{  &quot;data&quot;: [{   &quot;name&quot;: &quot;Mr. Frederik Morar&quot;  }, {   &quot;name&quot;: &quot;Angel Daniel&quot;  }, {   &quot;name&quot;: &quot;Brianne Mueller&quot;  }],  &quot;links&quot;: {   &quot;first&quot;: &quot;http://lab.php71/api-fields-2/public/api/users?page=1&quot;,   &quot;last&quot;: &quot;http://lab.php71/api-fields-2/public/api/users?page=7&quot;,   &quot;prev&quot;: null,   &quot;next&quot;: &quot;http://lab.php71/api-fields-2/public/api/users?page=2&quot;  },  &quot;meta&quot;: {   &quot;current_page&quot;: 1,   &quot;from&quot;: 1,   &quot;last_page&quot;: 7,   &quot;path&quot;: &quot;http://api-fields.lab.php71/api/users&quot;,   &quot;per_page&quot;: 3,   &quot;to&quot;: 3,   &quot;total&quot;: 20  } }</pre><div class="contentsignin">ログイン後にコピー</div></div>6- Summaryのメソッドで指定されているとおりです。この記事の目標は、

Resource

クラスは非表示のフィールドを渡します。一部のフィールドは、より柔軟にするために他のインターフェイスで公開することが許可されています。たとえば、

/users

インターフェイスをリクエストした場合、応答データには avatar フィールドが含まれませんが、/users/99 をリクエストした場合、応答データには avatar フィールドが含まれません。データには avatar フィールドが含まれています。 API リソースに対するリクエストを過度に繰り返すことはお勧めしません。単純なことがより複雑になる可能性があるためです。そのため、リクエスト時に特定のフィールドを非表示にすることが、よりシンプルで合理的な解決策となります。

推奨:
最新の 5 つの Laravel ビデオ チュートリアル

#

以上がLaravelでAPIフィールドを動的に非表示にする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート