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?
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.
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()));
}
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',...])
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()
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 :)
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');
}
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.
À 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);
}
}