PHPはLaravelでAPIフィールドを動的に非表示にする
私は最近Laravel Brasilコミュニティで問題を見て、結果は見た目よりもっと面白いです.
UsersResource
の次の実装を想像してみてください. $this->id,
'name' => $this->name,
'email' => $this->email
];
}
}
何らかの理由で、別のエンドポイントでリソースクラスを再使用したい場合がありますが、
email
フィールドは非表示です.この文章はあなたにこの点を実現する方法を教えてくれたのです.もしあなたがAPI Resources
が何なのか分からないなら、私の前のこの文章を見てください.大型プロジェクト実戦生放送加入(クリック→)私の生放送群6770797701-プロジェクトの初期化
おもしろいものは第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-コントローラ
コントローラは、所望のターゲットを表します.この例では、ユーザーリストでは、すべてのユーザーの名前だけが欲しく、ユーザー表示では電子メールアドレスだけを非表示にしたいと仮定します.
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::make
は、UsersResource
のオブジェクトを返す.したがって、hide
の神秘的なベールを解くべきであり、応答から除去することを望むキーを格納することができる.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": "[email protected]"
}
}
5-UsersResourceCollectionクラス
プロジェクトセットの
index
メソッドを実行するには、次のような変更が必要です.UsersResource::collection
がUsersResourceCollection
のインスタンスUsersResourceCollection
にhide
の方法UsersResource
(1)については、
UsersResource
の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
の方法を開示し、非表示フィールドを使用してセットを処理する.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
を要求したときの応答データにはavatar
フィールドが含まれている.APIリソースを過度に繰り返し要求することはお勧めしません.簡単なことをより複雑にする可能性が高いので、要求時に特定のフィールドを隠すのは、より簡単で合理的な解決策です.
phperは進級する時いつもいくつかの問題とボトルネックに出会って、業務コードは書きすぎて方向感がなくて、そこから昇格するべきだと知らないで、これに対して私はいくつかの資料を整理して、分布式のアーキテクチャ、高拡張性、高性能、高同時性、サービス器の性能の調整、TP 6、laravel、YII 2、Redis、Swoole、Swift、Kafka、Mysqlの最適化、shellスクリプト、Docker、マイクロサービス、Nginxなど複数の知識ポイント高級レベルアップ干物に必要なものを無料で共有できます(クリック→)私の公式グループ677079770