Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Laravel validation #13

Open
barryvdh opened this issue Nov 26, 2016 · 14 comments
Open

Laravel validation #13

barryvdh opened this issue Nov 26, 2016 · 14 comments

Comments

@barryvdh
Copy link
Owner

To make it easy to validate, we can use the Laravel validator with Symfony forms:

 $form = $factory->create(FormType::class, $user)
        ->add('name', TextType::class, [
            'rules' => 'required',
        ])
        ->add('email', EmailType::class, [
            'rules' => 'email|unique'
        ]);

This would run the validator post-submit, so you can check $form->isValid() after submitting the form. When failed, the errors on the form are added.

This seems to work already with this commit: 811ca4c

Next step would be to:

  • Make the required option based on the rule, but this would change the default (Symfony default is required = true), to make front-end always in sync with back-end validation
  • Add HTML5 attributes for rules (eg; min:3 -> minlength attribute etc)
@barryvdh
Copy link
Owner Author

So I can add the required rule when the required option is set, but the other way around doesn't seem to work; b4a4348

@barryvdh
Copy link
Owner Author

So front-end validation is roughly working: 64ff0cb
And setting default required state with the config: f1ccbc1

Could perhaps add some rules based on the type (eg Emailtype -> add email rules), but not really sure if that's possible.

@barryvdh
Copy link
Owner Author

barryvdh commented Feb 22, 2017

https://laravel.com/docs/5.4/upgrade#upgrade-5.4.0

Validation: Method Names
The addError method has been renamed to addFailure. In addition, the doReplacements method has been renamed to makeReplacements. Typically, these changes will only be relevant if you are extending the Validator class.

@alejobit
Copy link

alejobit commented Mar 26, 2017

When no rules defined:

BadMethodCallException in Validator.php line 3295:
Method [validateNullable] does not exist.

This is my composer dependencies:

    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.2.*",
        "barryvdh/laravel-form-bridge": "^0.3.2"
    },

Temporary solution: comment lines 49-51 in ValidationTypeExtension

            if (!in_array('required', $rules) && !in_array('nullable', $rules)){
                $rules[] = 'nullable';
            }

@barryvdh
Copy link
Owner Author

Ah, nullable doesn't exist in 5.2 we should probably add a check indeed.

@barryvdh
Copy link
Owner Author

Should be fixed with latest v0.3.3

@bobmulder
Copy link

Since #30 got closed, I'd like to mention that I got an issue with validation using the CollectionType in my parent form. Figured out that constraints (validation by Symfony Form itself) is working well. It seems that rules (implemented by @barryvdh ) don't work on child forms...

Any hint @barryvdh? I have no clue XD

Regards, Bob

@barryvdh
Copy link
Owner Author

Do you have a test case?

@bobmulder
Copy link

I'll post some code tomorow. Or do you prefer unit tests?

@barryvdh
Copy link
Owner Author

Nee a simple thing I can put in my own Laravel app is fine

@bobmulder
Copy link

bobmulder commented Oct 31, 2019

What about this? Simplified it but should work...

Parent

<?php

namespace App\Core\Http\Forms\Types;

use Illuminate\Validation\Rule;
use Laravel\Nova\Fields\Number;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class ParentFormType extends AbstractType
{

    public function __construct()
    {
    }

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $auth = auth();

        $builder
            ->add('sizeTo', NumberType::class, [
                'required' => true,
                'rules' => [
                    'min:00',
                    'max:99'
                ]
            ])
            ->add('weight', NumberType::class, [
                'required' => false,
                'rules' => [
                    'numeric'
                ]
            ])
            ->add('weightUnit', TextType::class, [
                'required' => false,
                'rules' => [
                    Rule::in(['kg', 'ha'])
                ]
            ])
            ->add('childs', CollectionType::class, [
                'label' => false,
                'entry_type' => ChildType::class,
                'allow_add' => true,
            ])
            ->add('submit', SubmitType::class);
    }
}

Child

<?php

namespace App\Core\Http\Forms\Types;

use Illuminate\Validation\Rule;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ChildType extends AbstractType
{

    public function __construct()
    {
    }

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $auth = auth();

        $builder
            ->add('class', TextType::class, [
                'required' => true,
            ])
            ->add('size', NumberType::class, [
                'required' => true,
                'rules' => [
                    'min:00',
                    'max:99'
                ]
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => ParentData::class,
        ]);
    }
}

barryvdh added a commit that referenced this issue Nov 2, 2019
@barryvdh
Copy link
Owner Author

barryvdh commented Nov 2, 2019

I recreated this and added a level deeper. I made some changes (see 746fae0) and now I get this rule set:

Screen Shot 2019-11-02 at 14 15 04

It should add the validation for the children when at least 1 of the children is in the form input.

You can test this with 0.5@dev, can you check it out?

@bobmulder
Copy link

Great work Barry! I'll check it out Monday morning! Have a nice weekend.

barryvdh added a commit that referenced this issue Nov 4, 2019
@bobmulder
Copy link

Hi there! It's me again :) last week I got some new validation issues with collections combined with Laravel's rules. I'll dig into this and I'll try to create a reproduction.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants