追加フィールドのルールでリクエストを検証するか、リクエストからそのフィールドを削除することは可能ですか?
簡単な例、ルール付きのFormRequestオブジェクトがあります。
public function rules() {
return [
'id' => 'required|integer',
'company_name' => 'required|max:255',
];
}
そして、他のフィールドで投稿リクエストを受け取ったとき、コントローラでエラー/例外を取得したい、またはidフィールドとcompany_nameフィールドのみを取得し、他は取得したくない。 laravel=に機能があります。それとも、自分のやり方で作成する必要がありますか?
Laravelでリクエストからキーを削除するには、次を使用します。
$request->request->remove('key')
laravelを使用した投稿リクエストには、フォームの入力以外にも多くのものがあります。そのため、リクエストをチェックして内容を確認する必要があります。
必要なフィールドのみを取得するには、次を使用できます。
$request->only(['fieldname1', 'fieldname2', 'fieldname3']);
または
$request->except(['fieldnameYouDontWant1', 'fieldnameYouDontWant2', 'fieldnameYouDontWant3']);
不要なものを除外します。
Laravel 5.5であるため、コントローラーでこれを行うことができます。
public function store(StoreCompanyRequest $request)
{
Company::create($request->validated());
}
Validated()関数は、検証したフィールドのみを返し、他のすべてを削除します。
このための新しいソリューションがあり、フォームリクエストクラスに新しい関数を作成します。
_public function onlyInRules()
{
return $this->only(array_keys($this->rules()));
}
_
次に、コントローラーで、$request->onlyInRules()
の代わりに$request->all()
を呼び出します
ネストされた配列要素の検証を開始すると、特にワイルドカードが関係する場合、事態は少し複雑になります。これをカスタムRequest
クラスに入れ、コントローラーメソッドにインジェクトします。すべてのケースをカバーする必要があります。
public function authorize()
{
//Dot notation makes it possible to parse nested values without recursion
$original = array_dot($this->all());
$filtered = [];
$rules = collect($this->rules());
$keys = $rules->keys();
$rules->each(function ($rules, $key) use ($original, $keys, &$filtered) {
//Allow for array or pipe-delimited rule-sets
if (is_string($rules)) {
$rules = explode('|', $rules);
}
//In case a rule requires an element to be an array, look for nested rules
$nestedRules = $keys->filter(function ($otherKey) use ($key) {
return (strpos($otherKey, "$key.") === 0);
});
//If the input must be an array, default missing nested rules to a wildcard
if (in_array('array', $rules) && $nestedRules->isEmpty()) {
$key .= ".*";
}
foreach ($original as $dotIndex => $element) {
//fnmatch respects wildcard asterisks
if (fnmatch($key, $dotIndex)) {
//array_set respects dot-notation, building out a normal array
array_set($filtered, $dotIndex, $element);
}
}
});
//Replace all input values with the filtered set
$this->replace($filtered);
//If field changes were attempted, but non were permitted, send back a 403
return (empty($original) || !empty($this->all()));
}
指定されたフィールド以外のフィールドを提供する要求のメソッド以外を使用できます
$request = $request->except('your_field');
リクエストから複数のフィールドを削除する場合は、フィールドの配列を渡すことができます
$request = $request->except(['field_1','field_2',...])
FormRequestクラスのメソッドvalidate()をオーバーライドすることでそれを行いました。
abstract class MyFormRequest extends FormRequest {
public function validate() {
foreach ($this->request->all() as $key => $value) {
if (!array_key_exists($key, $this->rules())) {
throw new ValidationException("Field " . $key . " is not allowed.");
}
}
parent::validate();
}
}
最善の方法ではないと思いますが、うまくいきます。一度にすべての間違ったフィールドに関する情報を表示するようにアップグレードする必要があります:)
コントローラーを使用して実行できます。データベースには2つまたは特定のフィールドのみを送信できます。 $request->only()
の代わりに$request->all()
を使用し、データベースに保存するデータの配列を渡します。 controller
のstore()
メソッドは次のようになります。
public function store(Request $request)
{
ModelName::create($request->only(['id','company_name']));
return redirect('RouteName');
}
$request->validated();
検証されたデータのみを返します。
コントローラーメソッドで:
public function myController(ValidationRequest $request) {
$data = $request->validated();
}
開始フォームLaravel 5.5では、validate
メソッドでRequest
メソッドを呼び出すことができます。
class YourController extends Controller
{
public function store(Request $request) {
$cleanData = $request->validate([
'id' => 'required|integer',
'company_name' => 'required|max:255',
]);
// Now you may safely pass $cleanData right to your model
// because it ONLY contains fields that in your rules e.g
$yourModel->create($cleanData);
}
}
残念ながら、ここでの回答の大部分は元の問題の要点を逃しています。つまり、FormRequestクラスで検証が必要なフィールドを指定し、コントローラーで次のようにします。
Something::create($request->validated());
ただし、特定のフィールドを検証したいが、コントローラーのcreate
メソッドに渡したくない場合があります。 $request->only()
または$request->except()
を実行する際の問題は、FormRequestクラスのフィールドを繰り返すか、モデルの_$guarded
_プロパティでフィールドを繰り返す必要があることです。
残念ながら、あなたが望むことをするために私が見つけた唯一の方法は次のとおりでした:
Something::create(collect($request->validated())->forget('field_you_dont_want')->toArray());