web-dev-qa-db-fra.com

Valider ou supprimer des champs supplémentaires dans laravel

Est-il possible de valider la demande avec des règles pour des champs supplémentaires, ou de supprimer ces champs de la demande?

Exemple simple, j'ai un objet FormRequest avec des règles:

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

Et lorsque je reçois une demande de publication avec tout autre champ, je souhaite obtenir une erreur/une exception dans le contrôleur ou je ne souhaite obtenir que les champs id et company_name, sans autres. Il existe une fonctionnalité dans laravel avec cela, ou je dois le faire dans mon chemin?

14
Son

Votre demande de publication avec laravel a plus de choses que votre saisie de formulaire, vous devez donc vérifier Demande pour voir ce qu’il contient. 

Pour obtenir uniquement les champs souhaités, vous pouvez utiliser: 

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

ou

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

exclure ceux que vous ne voulez pas. 

11
Can Celik

Pour retirer la clé de la demande dans Laravel, utilisez: 

$request->request->remove('key')

Les choses deviennent un peu plus délicates lorsque vous commencez à entrer dans les validations d'éléments de tableau imbriqués, en particulier si des caractères génériques sont impliqués. Mettez ceci dans votre classe Request personnalisée et insérez-la dans la méthode de votre contrôleur. Devrait couvrir tous les cas.

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

Vous pouvez utiliser la méthode except de requête qui vous donnera des champs excepté les champs donnés

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

si vous voulez supprimer plusieurs champs de la demande, vous pouvez passer un tableau des champs

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

Référence: Demandes Laravel

2
Mehul Panchasara

J'ai une nouvelle solution pour cela, créez une nouvelle fonction dans votre classe de demande de formulaire:

public function only_in_rules(){
    return $this->only(array_keys($this->rules()));
}

Ensuite, dans votre contrôleur, appelez $request->only_in_rules() au lieu de $request->all()

1
Haidang Nguyen

Je l'ai fait par la méthode override validate () dans la classe FormRequest.

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

Je pense que ce n'est pas la meilleure façon, mais ça marche. Je devrais le mettre à jour pour afficher les informations sur tous les champs erronés à la fois :)

1
Son

Vous pouvez le faire via votre contrôleur. Vous ne pouvez envoyer que deux ou certains champs à la base de données. Utilisez $request->only() au lieu de $request->all() et transmettez un tableau de données que vous souhaitez enregistrer dans la base de données. Votre méthode controller 's store() devrait ressembler à ceci:

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

Depuis Laravel 5.5, vous pouvez le faire dans votre contrôleur:

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

La fonction validated () ne renvoie que les champs que vous avez validés et supprime tout le reste.

0
user3743266

À partir de Laravel 5.5, vous pouvez appeler la méthode validate directement sur Request p. Ex.

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
Andrii Yasynovyi