Laravel是否支持“类型化”请求?

时间:2019-06-28 08:39:16

标签: laravel rest api

要将数据库实体转换为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);
}

1 个答案:

答案 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'

不要害羞地查看请求和表单请求的源代码,原因不是您希望的所有方法都在文档中进行了描述。希望这会有所帮助