要将数据库实体转换为API响应,Laravel支持资源,例如。 UserResource extends JsonResource
。该资源使我能够明确定义应将实体中的哪些字段包括在响应中,以及如何对其进行转换等。
请求是否具有类似的功能?我的请求通常如下所示:
public function create(JsonRequest $request): UserResource
{
$data = $request->json()->all();
/* Remove, transform, add request fields etc. */
$user = User::create($data);
$user->save();
return new UserResource($user);
}
在我们的案例中,我们在现代API的后面有一个旧数据库,因此在将它们放入实体类之前,需要转换,重命名等许多字段。各个请求的字段不同,但是步骤非常相似。是否有一种简化的方式来做到这一点,类似于资源如何将实体转换为响应?
类似的东西:
class UserRequest extends JsonRequest {
public function fromArray(JsonRequest $request) {
…
}
}
然后请求可能如下所示:
public function create(UserRequest $request): UserResource
{
$user = User::create($request);
$user->save();
return new UserResource($user);
}
答案 0 :(得分:1)
我想,您的大多数问题都可以解决form request。参见下面的示例
表单请求类:
$?
这是我的测试路线:namespace App\Http\Requests;
use Carbon\Carbon;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
class TestRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'date' => 'required|date_format:Y-m-d H:i:s',
'name' => 'required|string',
];
}
// here you can specify custom error messages
public function messages()
{
return [
'date.required' => 'No date specified',
'date.date_format' => 'Invalid date format',
'name.required' => 'No name specified',
'name.string' => 'Invalid name format',
];
}
// here you can implement some data mapping before validation
protected function validationData()
{
return $this->transform($this->all());
}
// some data transformation logic
// You can place it anywhere in your applciation services
protected function transform($input)
{
$transformed = [];
foreach ($input as $field => $value) {
if ($field == 'name') {
$value = strtoupper($value);
} elseif ($field == 'date') {
$value = Carbon::parse($value)->toDateTimeString();
}
$transformed[$field] = $value;
}
return $transformed;
}
public function failedValidation(Validator $validator)
{
// here you can implement custom validation failure
parent::failedValidation($validator);
}
}
和控制器:
Route::get('/test', 'TestController@index');
因此,然后请求路由:use App\Http\Requests\TestRequest;
class TestController extends Controller
{
public function index(TestRequest $request)
{
return response()->json($request->validated());
}
}
并获得响应:curl -H 'Accept: application/json' 'http://localhost:8000/test?date=01.01.2019&name=petya'
不要害羞地查看请求和表单请求的源代码,原因不是您希望的所有方法都在文档中进行了描述。希望这会有所帮助