2017-02-28 3 views
1

私はBackpack CrudControllerを拡張する私のカスタムRequestを持っています。laravel 5.4要求の検証の前にデータを変更します

今では私の着信データを修正するために適切な場所のように見えるので、私はValidatesWhenResolvedTraitのprepareForValidationを上書きしたいと思いますが、私はだから私の最初の質問はどのように...

把握することはできません、することができます私はこのメソッドをオーバーライドしますか?その保護された...

protected function prepareForValidation() 

そして、私の2番目の質問は、はどのように私は要求またはFormRreuqestオブジェクトに私の入力を変更することができますか?ここで

あなたがを見ることができるように私のRequestClass

<?php 

namespace App\Http\Requests; 

use App\Http\Requests\Request; 
use Config; 

class DonationsRequest extends \Backpack\CRUD\app\Http\Requests\CrudRequest 
{ 


    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     // only allow updates if the user is logged in 
     return \Auth::check(); 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     return [ 
      'name' => 'required|max:255', 
      'email' => 'required|email', 
      'dob' => 'required|date', 
      'newsletter' => 'required|boolean', 
      'country' => 'sometimes|required|in:'.implode(',', Config::get('validation.countries')), 
      'street' => 'sometimes|required|string|max:255', 
      'zip' => 'sometimes|required|string|between:4,5', 
      'city' => 'sometimes|required|string|between:4,255', 
      'amount' => 'required|numeric|between:1,'.Config::get('donations.max'), 
      'type' => 'required|in:oo,monthly', 
      'provider' => 'sometimes|string|nullable', 
      'product_id' => 'sometimes|exists:products,id|nullable', 
      'campaign_id' => 'required|exists:campaigns,id', 
      'status' => 'sometimes|required|in:pending,canceled,success,error', 
      'profile' => 'sometimes|string|regex:/^profile[0-9]+$/|nullable', 
     ]; 
    } 

    /** 
    * Get the validation attributes that apply to the request. 
    * 
    * @return array 
    */ 
    public function attributes() 
    { 
     return [ 
      // 
     ]; 
    } 

    /** 
    * Get the validation messages that apply to the request. 
    * 
    * @return array 
    */ 
    public function messages() 
    { 
     return [ 
      // 
     ]; 
    } 

    private function prepareForValidation() 
    { 

     dd('getValidatorInstance custom'); 

     $this->sanitizeInput(); 

     return parent::getValidatorInstance(); 
    } 

    private function sanitizeInput() 
    { 

     dd('sanitizeInput custom'); 

     $data = $this->all(); 

     dd($data); 

     // overwrite the newsletter field value to match boolean validation 
     $data['newsletter'] = ($data['newsletter'] == 'true' || $data['newsletter'] == '1' || $data['newsletter'] == true) ? true : false; 

     return $data; 
    } 

    private function validate() { 
     dd('validate'); 
    } 
} 

ですが、私は最初にそう(ではない、これは、この共通のaproachのように見えたことから、g​​etValidatorInstanceメソッドをオーバーライドしようとしましたが、それは実行されません保護されていますか?

+0

私は現時点ではテストすることができませんが、これはたぶんタイプミスですか? 'private function prepareForValidation()'をpublicに変更してみてください。 – Sheraz

+0

いいえ、違いはありません...メソッドをオーバーライドできません:/ thx! –

+0

'prepareForValidation()'が保護されているかどうかは関係ありません。これは、これらのタイプのタスクを実行するためにオーバーライドする必要があるメソッドです。このメソッドの内部では、 '$ this-> replace()'を呼び出して、入力をサニタイズされたバリアントに置き換えます。 –

答えて

0

いいえどこでエラーが発生したのか分かりました。フロントエンドリクエストとバックエンドリクエストコールを分割しました。私はバックエンドのリクエストに取り組んでいたので、フロントエンドリクエストは何も上書きしていませんでした...それは私の悪いものでした。そこにバグはありませんでした。時間の無駄に泣きましたが、コミュニティに大きな感謝!

5

私は試していませんが、うまくいくはずですが、validationDataからIlluminate\Foundation\Http\FormRequestのように上書きできます。

/** 
* Get data to be validated from the request. 
* 
* @return array 
*/ 
protected function validationData() 
{ 
    $all = parent::validationData(); 
    //e.g you have a field which may be json string or array 
    if (is_string($playerIDs = array_get($all, 'player_id'))) 
     $playerIDs = json_decode($playerIDs, true); 

    $all['player_id'] = $playerIDs 
    return $all; 
} 

か、Illuminate\Http\Concerns\InteractsWithInputトレイト

/** 
* Get all of the input and files for the request. 
* 
* @return array 
*/ 
public function all() 
{ 
    $all = parent::all(); 
    //then do your operation 
    if (is_string($playerIDs = array_get($all, 'player_id'))) 
     $playerIDs = json_decode($playerIDs, true); 

    $all['player_id'] = $playerIDs 
    return $all; 
} 
+0

私は両方を試しましたが、上書きを受け入れません。この仕事をするために何か特別なものを作らなければならないのですか?どういうふうにその特質やクラスを言いますか? –

+0

@ThomasVenturini私は自分の答えを更新しました履歴をチェックしてくださいあなたが成功しなかったらあなたの質問を更新してくださいあなたがしたことを私たちに知らせてください –

0

あなたが要求を変更する可能性にallメソッドをオーバーライドすることができますか?

$request->merge(['field' => 'new value']); 
+0

そしてどこでそうするのですか?この問題は、説明したように、オーバーライドする方法が見つからないということです。しかしthx :) –

0

まあ、私はこれが入力を変更するには助けることができる、と確信して、それは私のために働いた。[laravel 5.4] listFormRequestで

場所この

​​

。 (上記の答えに従うと$inputの代わりに$allを使用してください)。

これは入力を変更するだけで、コントローラでも使用できます。 DBに挿入する方法を見つけたり、変更された入力を使用してブレードで使用する必要があります。

+0

これはThomas Venturiniの@Tim Jaiへの質問に対する答えかもしれません。 – RajG

関連する問題