Рубрики
Uncategorized

Динамически скрывать поля API в laravel

Автор оригинала: David Wong.

Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t

Недавно я столкнулся с проблемой в сообществе laravel Brasil, которая оказалась более интересной, чем казалось. Представьте, что у вас есть Пользователи ресурса Используют следующую реализацию:

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 [
            'id' => $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

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, потому что это, скорее всего, усложнит простые вещи, поэтому более простым и разумным решением является скрытие определенных полей при запросе.