Il est temps de commencer à écrire sur les nouvelles fonctionnalités de Laravel 5.2 ! Vous remarquerez que bon nombre de ces fonctionnalités sont plus rapides et plus faciles à apprendre et à écrire, il peut donc sembler qu’il s’agit d’une version plus petite. Mais de nombreuses fonctionnalités de la version 5.2 auront un impact important sur la simplicité et la commodité du code que nous écrivons au jour le jour.
Une introduction rapide aux tableaux HTML Form
La validation de tableau de formulaire simplifie le processus de validation de la forme quelque peu anormale des données que les formulaires HTML transmettent lorsque la syntaxe de tableau est utilisée. Si vous ne le connaissez pas, un cas d’utilisation courant est lorsque vous autorisez un utilisateur à ajouter plusieurs instances du même type sur un formulaire.
Imaginons que vous ayez un formulaire dans lequel un utilisateur ajoute un entrepriseet dans le cadre de celui-ci, ils peuvent ajouter autant de employés à l’entreprise comme ils le souhaitent. Chaque employé a un nom et un titre.
Voici notre HTML ; imaginez que nous ayons du JavaScript qui crée une nouvelle div “employé” chaque fois que vous appuyez sur le bouton “Ajouter un autre employé” afin que l’utilisateur puisse ajouter autant d’employés qu’il le souhaite.
<form>
<label>Company Name</label>
<input type="text" name="name">
<h3>Employees</h3>
<div class="add-employee">
<label>Employee Name</label>
<input type="text" name="employee[1][name]">
<label>Employee Title</label>
<input type="text" name="employee[1]Form array validation in Laravel 5.2">
</div>
<div class="add-employee">
<label>Employee Name</label>
<input type="text" name="employee[2][name]">
<label>Employee Title</label>
<input type="text" name="employee[2]Form array validation in Laravel 5.2">
</div>
<a href="#" class="js-create-new-add-employee-box">Add another employee</a>
<input type="submit">
</form>
````
If you fill out that form and submit it, this is the shape of the `$_POST`:
tableau(2) {
[“name”]=> string(10) “Acme, Inc.”
[“employee”]=> tableau(2) {
[1]=> tableau(2) {
[“name”]=> string(10) “Joe Schmoe”
[“title”]=> string(11) “Personne principale” }
[2]=> tableau(2) {
[“name”]=> string(18) “Albatros Conchita”
[“title”]=> string(21) “Personne responsable de la direction” } } }
As you can see, we get an `employee` "object". And it contains an array of the IDs that we passed in, with the key/value pairs of "fieldname" => "user provided field value".
> Note: It used to be common to just set every instance of the "employee name" field, for example, to be just `employee[][name]` without setting the ID manually. *Don't do this.* It'll make every aspect of working with the code more complex.
But how do we validate this? Prior to 5.2, it's a bunch of manual work. Now, Laravel understands this nesting structure and can validate against it uniquely.
## Writing form array validation rules
So, how do we do it? Let's take a look at a normal validator:
```php
// CompaniesController.php
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|string'
]);
// Save, etc.
}
Et maintenant, ajoutons une validation pour les champs des employés de notre entreprise :
// CompaniesController.php
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|string',
'employee.*.name' => 'required|string',
'employee.*.title' => 'string',
]);
// Save, etc.
}
Maintenant, nous validons chaque employee[*][name]
et employee[*]Form array validation in Laravel 5.2
de manière unique, sans pratiquement aucun effort de notre part. Beau.
Post-scriptum
Vous avez peut-être remarqué que la forme de la validation est employee.*.name
avec un astérisque au milieu, ce qui indique presque que vous pourriez y mettre autre chose.
Et si, au lieu d’un astérisque pour indiquer “tous”, vous y mettiez un chiffre précis ? Il s’avère que cela ne validera que les entités avec cet ID. Donc si vous mettez employee.1.name
dans le tableau de validation au lieu de employee.*.name
seul l’employé avec l’ID de 1
seront validés selon ces règles.
Je ne sais pas pourquoi ni quand vous le feriez, mais vous pourriez en fait définir des règles de validation complètement distinctes pour chaque ID :
$this->validate($request, [
'employee.1.name' => 'required|string',
'employee.2.name' => 'integer', // Not sure *why* you would do this, but, it's possible
]);
C’est ça. Apprécier!