web-dev-qa-db-ja.com

Laravel 5.1で検証する前に入力を変更する

検証が成功する前に、ユーザーが送信した入力を変更しようとしています。私は この簡単な手順 に従いましたが、Laravel 5.1、それは機能していません。私は何かをしていますか?間違っていますか?

これは_SSHAM\Http\Requests\UserCreateRequest.php_の私のリクエストクラスです

_<?php

namespace SSHAM\Http\Requests;

use SSHAM\Http\Requests\Request;

class UserCreateRequest extends Request
{

    // Some stuff not related with this problem

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        // Only for debug
        $prova = $this->all();
        echo "<pre>Inside Request - Before sanitize\n[" . $prova['public_key'] . "]</pre>\n";

        // Call a function to sanitize user input
        $this->sanitize();

        // Only for debug    
        $prova = $this->all();
        echo "<pre>Inside Request - After sanitize\n[" . $prova['public_key'] . "]</pre>\n";

        return [
            'username' => 'required|max:255|unique:users',
            'public_key' => 'openssh_key:public',
        ];
    }

    /**
     * Sanitizes user input. In special 'public_key' to remove carriage returns
     */
    public function sanitize()
    {
        $input = $this->all();

        // Removes carriage returns from 'public_key' input
        $input['public_key'] = str_replace(["\n", "\t", "\r"], '', $input['public_key']);

        $this->replace($input);
    }

}
_

これは_SSHAM\Providers\OpenSSHKeyValidatorServiceProvider.php_に関する私のカスタム検証ルールです

_<?php

namespace SSHAM\Providers;

use Illuminate\Support\ServiceProvider;

class OpenSSHKeyValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        // Registering the validator extension with the validator factory
        \Validator::extend('openssh_key', function ($attribute, $value, $parameters) {

            // Some stuff not related with this problem    

            // Only for debug
            echo "<pre>Inside Validator value\n[" . $value ."]</pre>\n";
            dd();

            return true;
        });

    }

    // Some stuff not related with this problem    
}
_

デバッグを呼び出すと、次の出力が得られます。

_Inside Request - Before sanitize
[blah 
second line 
third line]

Inside Request - After sanitize
[blah second line third line]

Inside Validator value
[blah 
second line 
third line]
_

sanitize()は機能しているようですが、検証クラスで値が処理されると、サニタイズされていません。

16
Paco Orozco

これはトリッキーなものです。私はあなたが望むものを達成するための1つの方法しか考え出しませんでした。

重要な点は、rules()関数でリクエスト値を変更しても、バリデーターには影響がないということです。

UserCreateRequestに関数を追加することで、回避策を実行できます。

protected function getValidatorInstance() {
    $this->sanitize();
    return parent::getValidatorInstance();
}

これは、親のgetValidatorInstance();をオーバーライドします。

親のgetValidatorInstance()メソッドには次のものが含まれます

    return $factory->make(
        $this->all(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes());

これはrules()関数のコードの前に到達するため、$ this-> all()の古い値(rules()の変更による影響を受けない)が使用されます。

独自のRequestClassでその関数をオーバーライドすると、実際の親のメソッドを呼び出す前にRequest値を操作できます。

PDATE(L5.5)

Controllers validate関数を使用している場合は、次のようなことができます。

    $requestData = $request->all();

    // modify somehow
    $requestData['firstname'] = trim($requestData['firstname']);

    $request->replace($requestData);

    $values = $this->validate($request, $rules);
19
shock_gone_wild

これを行うには、リクエストを変更して入力値を設定します。

$request->request->set('key', 'value');

または、requestヘルパーメソッドを使用する場合。

request()->request->set('key', 'value');
8
Enijar

これらの答えは5.5では機能しなくなりました

あなたが使用することができます

protected function validationData()
{
    $this->request->add([
        'SomeField' => '..some code to modify it goes here'
    ]);
    return $this->request->all();
}

要求に応じてaddメソッドは、そのキーの既存の入力を上書きします。

トレイルをたどると、Illuminate\Foundation\Http\FormRequestでこれが機能する理由がわかります。

/**
 * Get data to be validated from the request.
 *
 * @return array
 */
protected function validationData()
{
    return $this->all();
}
3
Scott Flack

検証を維持するためにリクエストMyClassRequestを使用している場合は、Requestクラスのall()メソッドをオーバーライドするだけです。

public function all()
{
    $attributes = parent::all();

    //you can modify your inputs here before it is validated
    $attribute['firstname'] = trim($attribute['firstname']);
    $attribute['lastname'] = trim($attribute['lastname']);

    return $attributes;
}

お役に立てれば。

3
karmendra

PrepareForValidationメソッドを使用できます

protected function prepareForValidation() 
{
    $this->merge(['field' => 'field value' ]) ;
} 
0
mag