01/10/2018, 10:54

Hỏi về Form Request Validation

Mình mới tìm hiểu Laravel, và xài form request để validate request,

Mình có tạo 2 cái FormRequest là StoreContact và StoreReservation

Làm thế nào để có thể gọi cả 2 cái form request này trong một request?

VD:

public function store(Request $request) {
    $this->_storeContact($request);
    $this->_storeReservation($request);
    ...
}
private function _storeContact(StoreContact $request) {...}
private function _storeReservation(StoreReservation $request) {...}
Ice Tea viết 12:58 ngày 01/10/2018

Sao bạn phải tách ra 2 form request nhỉ? Nó chỉ dùng cho 1 action thôi mà.

Cơ mà vẫn có cách. Cơ chế của FormRequest là:

  1. Laravel tự động resolve (khởi tạo đối tượng) từ container dựa vào type hint trong method
  2. Sau khi resolve nó thực hiện validate request luôn.
    Bạn xem code của họ sẽ rõ:
    Files: config/app.php => provider Illuminate\Foundation\Providers\FoundationServiceProvider => Illuminate\Foundation\Providers\FormRequestServiceProvider

Cách 1:
Hint cả 2 cái FormRequest vào function store, laravel tự động resolve và validate:

public function store(
    StoreContact $storeContactRequest, 
    StoreReservation $storeReservationRequest
) {
    $this->_storeContact($storeContactRequest);
    $this->_storeReservation($storeReservationRequest);
    ...
}
private function _storeContact($request) {...}
private function _storeReservation($request) {...}

Cách 2:
Resolve 2 cái form request đó từ container, dùng helper resolve() hoặc app()

public function store(Request $request) {
    app(StoreContact::class);
    app(StoreReservation::class);
    
    $this->_storeContact($request);
    $this->_storeReservation($request);
    ...
}
private function _storeContact($request) {...}
private function _storeReservation($request) {...}

Nếu muốn rõ ràng hơn thì viết thế này:

public function store(Request $request) {
    $storeContactRequest = app(StoreContact::class);
    $toreReservationRequest = app(StoreReservation::class);
    
    $this->_storeContact($storeContactRequest);
    $this->_storeReservation($toreReservationRequest);
    ...
}
private function _storeContact(StoreContact $request) {...}
private function _storeReservation(StoreReservation $request) {...}
Jo Ker viết 13:02 ngày 01/10/2018

Vì mình còn có action lưu contact và reservation riêng nên phải chia ra làm 2 FormRequest.
Thank bạn, mình thấy cách 2 rất hay.

Bài liên quan
0