Я создаю REST API, который будет возвращать разные ответы JSON в зависимости от того, какой тип пользователя выполняет вызов.
Существует одна конечная точка: example.com/api/v1/collect
, которая использует Аутентификация API Laravel для получения пользовательской модели с $user = auth()->guard('api')->user();
.
Каждый User
будет принадлежать Type
.
Если User 1
(type_id 1) делает вызов, ответбудет выглядеть так:
{
"example": 1,
"success": true,
"data" : [
...
]
}
Если User 2
(type_id 2) совершит вызов, ответ может быть различным, в зависимости от типа пользователя.Это может выглядеть следующим образом:
{
"example": 2,
"response" : [
...
],
"custom": "string",
"success": 200
}
...
- это данные, которые мы отправляем обратно (например, список заголовков сообщений), и они всегда будут одинаковыми, но «конверт» (илиОбертка) будет определяться для каждого пользователя (или типа пользователя).
До сих пор я нашел два решения для обёртывания этого ...
абстрактным способом:
Решение 1 : Использование Laravel Blade
// Api\V1\ApiController.php
$data = $user->posts->pluck('title');
// Each type of user will have a different blade filename
// There could be around a 100 types which will result in a 100 blade files
// The filename is stored in the database
$filename = $user->type->filename; // returns 'customBladeTemplate'
// Return a JSON response after passing the $data to the view
return response()->json([
view($filename, compact('data'))->render(),
]);
Использование файла блейда для каждого типа пользователя позволяет мне обернуть данные следующим образом:
// resources/views/customBladeTemplate.blade.php
// This filename has to match the one in the database column
{
"example": 1,
"success": true,
"data" : [
{!! $data !!}
]
}
Выводит ответ JSON для пользователя 1 (пример 1)
Решение 2 : Использование макросов ответа Laravel
// Api\V1\ApiController.php
$data = $user->posts->pluck('title');
// Each type of user will have a different macro name
// There could be around a 100 types which will result in a 100 different macros
// The macro name is stored in the database
$macroName = $user->type->macro_name; // returns 'customMacroName'
return response()->{macroName}($data);
Создание макроса для каждого типа пользователя с использованием имени макроса из БД:
// App\Providers\AppServiceProvider.php
use Illuminate\Http\Response;
public function boot()
{
Response::macro('customMacroName', function ($data) {
return Response::json([
'example' => 2,
'response' => $data,
'custom' => 'string',
'success' => 200,
]);
});
}
Этот макрос выведет ответ JSON для пользователя 2 (пример 2)
Оба варианта работают нормально, но мне все еще интересно:
- Есть еще один ( возможно лучше ) wможно сделать это?
- Являются ли эти два решения допустимыми или могут быть улучшены?
- Какое из этих двух решений кажется лучше и почему?
Редактировать: На самом деле $data
на самом деле не из красноречивой модели, а скорее из сериализованного столбца JSON ( приведение JSON ) - что означает, что я могуt ресурсы API Laravel