Laravel是否支持;“打字”;请求?

Laravel是否支持;“打字”;请求?,laravel,rest,api,Laravel,Rest,Api,要将数据库实体转换为API响应,请访问支持资源,例如,UserResource扩展了JsonResource。该资源允许我清晰地定义响应中应该包含实体中的哪些字段,以及如何转换这些字段等 对于请求是否有类似的功能?我的请求通常如下所示: public function create(JsonRequest $request): UserResource { $data = $request->json()->all(); /* Remove, transform, a

要将数据库实体转换为API响应,请访问支持资源,例如,
UserResource扩展了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(JsonRequest $request): UserResource
{
    $data = $request->json()->all();
    /* Remove, transform, add request fields etc. */
    $user = User::create($data);
    $user->save();
    return new UserResource($user);
}
公共函数创建(UserRequest$request):UserResource
{
$user=user::create($request);
$user->save();
返回新的UserResource($user);
}

我想,你的大多数问题都可以解决。见下面的例子

表格申请类别:

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“

并获得响应:
{“日期”:“2019-01-01 00:00:00”,“姓名”:“PETYA”}


不要羞于看到请求和表单请求的源代码,因为文档中并没有描述您希望使用的所有方法。希望这有帮助

您可能正在寻找表单请求。不要提供筛选或更改请求数据的方法,它只是验证和测试用户是否有权调用此请求