検証が成功する前に、ユーザーが送信した入力を変更しようとしています。私は この簡単な手順 に従いましたが、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()
は機能しているようですが、検証クラスで値が処理されると、サニタイズされていません。
これはトリッキーなものです。私はあなたが望むものを達成するための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);
これを行うには、リクエストを変更して入力値を設定します。
$request->request->set('key', 'value');
または、request
ヘルパーメソッドを使用する場合。
request()->request->set('key', 'value');
これらの答えは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();
}
検証を維持するためにリクエスト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;
}
お役に立てれば。
PrepareForValidationメソッドを使用できます
protected function prepareForValidation()
{
$this->merge(['field' => 'field value' ]) ;
}