Laravel是否支持;“打字”;请求?
要将数据库实体转换为API响应,请访问支持资源,例如,Laravel是否支持;“打字”;请求?,laravel,rest,api,Laravel,Rest,Api,要将数据库实体转换为API响应,请访问支持资源,例如,UserResource扩展了JsonResource。该资源允许我清晰地定义响应中应该包含实体中的哪些字段,以及如何转换这些字段等 对于请求是否有类似的功能?我的请求通常如下所示: public function create(JsonRequest $request): UserResource { $data = $request->json()->all(); /* Remove, transform, a
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”}
不要羞于看到请求和表单请求的源代码,因为文档中并没有描述您希望使用的所有方法。希望这有帮助您可能正在寻找表单请求。不要提供筛选或更改请求数据的方法,它只是验证和测试用户是否有权调用此请求