web-dev-qa-db-ja.com

laravelの余分なフィールドの検証または削除

追加フィールドのルールでリクエストを検証するか、リクエストからそのフィールドを削除することは可能ですか?

簡単な例、ルール付きのFormRequestオブジェクトがあります。

public function rules() {
        return [
            'id' => 'required|integer',
            'company_name' => 'required|max:255',
        ];
    }

そして、他のフィールドで投稿リクエストを受け取ったとき、コントローラでエラー/例外を取得したい、またはidフィールドとcompany_nameフィールドのみを取得し、他は取得したくない。 laravel=に機能があります。それとも、自分のやり方で作成する必要がありますか?

19
Son

Laravelでリクエストからキーを削除するには、次を使用します。

$request->request->remove('key')
16
Anton Ganichev

laravelを使用した投稿リクエストには、フォームの入力以外にも多くのものがあります。そのため、リクエストをチェックして内容を確認する必要があります。

必要なフィールドのみを取得するには、次を使用できます。

$request->only(['fieldname1', 'fieldname2', 'fieldname3']);

または

$request->except(['fieldnameYouDontWant1', 'fieldnameYouDontWant2', 'fieldnameYouDontWant3']);

不要なものを除外します。

14
Can Celik

Laravel 5.5であるため、コントローラーでこれを行うことができます。

public function store(StoreCompanyRequest $request)
{
    Company::create($request->validated());
}

Validated()関数は、検証したフィールドのみを返し、他のすべてを削除します。

4
user3743266

このための新しいソリューションがあり、フォームリクエストクラスに新しい関数を作成します。

_public function onlyInRules()
{
    return $this->only(array_keys($this->rules()));
}
_

次に、コントローラーで、$request->onlyInRules()の代わりに$request->all()を呼び出します

3
Haidang Nguyen

ネストされた配列要素の検証を開始すると、特にワイルドカードが関係する場合、事態は少し複雑になります。これをカスタム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()));
}
3
Claymore

指定されたフィールド以外のフィールドを提供する要求のメソッド以外を使用できます

$request = $request->except('your_field');

リクエストから複数のフィールドを削除する場合は、フィールドの配列を渡すことができます

$request = $request->except(['field_1','field_2',...])

参照:Laravelリクエスト

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();
    }
}

最善の方法ではないと思いますが、うまくいきます。一度にすべての間違ったフィールドに関する情報を表示するようにアップグレードする必要があります:)

1
Son

コントローラーを使用して実行できます。データベースには2つまたは特定のフィールドのみを送信できます。 $request->only()の代わりに$request->all()を使用し、データベースに保存するデータの配列を渡します。 controllerstore()メソッドは次のようになります。

public function store(Request $request)
{
    ModelName::create($request->only(['id','company_name']));
    return redirect('RouteName');
}
0
smartrahat
$request->validated(); 

検証されたデータのみを返します。

コントローラーメソッドで:

public function myController(ValidationRequest $request) {
    $data = $request->validated();
}
0
Daniel Angel

開始フォーム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);
  }
}
0

残念ながら、ここでの回答の大部分は元の問題の要点を逃しています。つまり、FormRequestクラスで検証が必要なフィールドを指定し、コントローラーで次のようにします。

Something::create($request->validated());

ただし、特定のフィールドを検証したいが、コントローラーのcreateメソッドに渡したくない場合があります。 $request->only()または$request->except()を実行する際の問題は、FormRequestクラスのフィールドを繰り返すか、モデルの_$guarded_プロパティでフィールドを繰り返す必要があることです。

残念ながら、あなたが望むことをするために私が見つけた唯一の方法は次のとおりでした:

Something::create(collect($request->validated())->forget('field_you_dont_want')->toArray());

0
MrCarrot