Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t
Недавно я столкнулся с проблемой в сообществе laravel Brasil, которая оказалась более интересной, чем казалось. Представьте, что у вас есть Пользователи ресурса Используют следующую реализацию:
По какой-то причине вы можете захотеть повторно использовать класс ресурсов на другой конечной точке, но скрыть поле email . В этой статье рассказывается, как этого добиться. Если вы не знаете Ресурсы API Что это? Пожалуйста, ознакомьтесь с моей предыдущей статьей об этом.
- Первое впечатление о ресурсах API
- Ресурсы API с вложенными отношениями
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 – контроллер
Контроллер представляет желаемую цель. В этом примере давайте предположим, что в списке пользователей нам нужны только имена всех пользователей, в то время как на дисплее пользователя мы хотим скрыть только адрес электронной почты.
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']);
}
}Для этого нам нужно Коллекция ресурсов пользователей и Ресурс пользователей И знаю, как с этим бороться скрыть Позвонить.
4 – класс ресурсов пользователей
Давайте начнем с шоу Метод запуска Пользователи ресурса::сделать Вернется Ресурс пользователей Поэтому мы должны раскрыть скрыть Он может хранить ключи, которые мы ожидаем удалить из ответа
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 – класс коллекции ресурсов пользователей
Выполните индекс Методы, нам необходимо внести следующие изменения:
- ((1) обеспечить
Ресурсы пользователей::коллекцияВозвращениеКоллекция ресурсов пользователейПример - (2) в
Коллекция ресурсов пользователейОткрыто на рынкескрытьМетод - (3) передайте скрытые поля в
Ресурс пользователей
Что касается (1), нам просто нужно переписать Пользовательский ресурс Среда коллекция Метод
collects = __CLASS__;
});
}
/**
* @var array
*/
protected $withoutFields = [];
/**
* Transform the resource into an array.
*Convert resources to 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.
*Set keys to hide filtering
*
* @param array $fields
* @return $this
*/
public function hide(array $fields)
{
$this->withoutFields = $fields;
return $this;
}
/**
* Remove the filtered keys.
*Remove hidden keys
*
* @param $array
* @return array
*/
protected function filterFields($array)
{
return collect($array)->forget($this->withoutFields)->toArray();
}
}Что касается (2) и (3), нам нужно изменить Коллекция ресурсов пользователей Документы. Давайте обнародуем это спрячем
processCollection($request);
}
public function hide(array $fields)
{
$this->withoutFields = $fields;
return $this;
}
/**
* Send fields to hide to UsersResource while processing the collection.
*Processing collection of hidden fields through 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 Вы можете видеть, что возвращенных результатов нет идентификатор Сумма электронная почта Поле, как показано в 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 – краткая информация
Цель этой статьи состоит в том, чтобы Ресурсы Классы стали более гибкими, скрыв поля, которые могут быть открыты в других интерфейсах. Например, когда мы спрашиваем /пользователей Данные в ответе на интерфейс не содержат аватара Поля, но при запросе /пользователи/99 Данные о времени ответа содержат аватар Поле.
Я не рекомендую чрезмерно повторяться при запросе ресурсов API, потому что это, скорее всего, усложнит простые вещи, поэтому более простым и разумным решением является скрытие определенных полей при запросе.