Laravel Validation Same not Working as intended - php

I'm writing a Request Validator in Laravel, where I have the following conditions. To check if passwords given are the same, this will fail, with the message that the passwords are not the same, even though the passwords are the same.
'password1' => 'string',
'password2' => 'string|same: password1'
If I disable the validation and dd(Input::only('password1','password2'));, it will print out the following.
array:2 [
"password1" => "123"
"password2" => "123"
]
Why is the same validation not working?

Your issue is the space in your validation rule. You don't have a field named [space]password1 in your input, so the validation fails. Instead of same: password1, it should be same:password1.
'password1' => 'string',
'password2' => 'string|same:password1'
Another way that password confirmation is usually done is with the confirmed validation. Typically you have a password field and a password_confirmation field, and then the confirmed validation will validate that your password input has matching input from a *_confirmation field.
'password' => 'string|confirmed',
'password_confirmation' => 'string',

Related

Laravel Validation rules: required_without

I have two fields: Email and Telephone
i want to create a validation where one of two fields are required and if one or both fields are set, it should be the correct Format.
I tried this, but it doesnt work, i need both though
public static array $createValidationRules = [
'email' => 'required_without:telephone|email:rfc',
'telephone' => 'required_without:email|numeric|regex:/^\d{5,15}$/',
];
It is correct that both fields produce the required_without error message if both are empty. This error message clearly says that the field must be filled if the other is not. You may change the message if needed:
$messages = [
'email.required_without' => 'foo',
'telephone.required_without' => 'bar',
];
However, you must add the nullable rule, so the format rules don't apply when the field is empty:
$rules = [
'email' => ['required_without:telephone', 'nullable', 'email:rfc'],
'telephone' => ['required_without:email', 'nullable', 'numeric', 'regex:/^\d{5,15}$/'],
];
Furthermore: It is recommended writing the rules as array, especially when using regex.

Laravel validation for ensuring difference in values

For the below code , i don't want the password field to have the same value of currentPassword field. The desired output is to show some validation error like "password & currentPassword canot be the same" ,when one types same value for both password & currentPassword fields. To be more precise, it should work in opposite of the rule - same does.
$validator = Validator::make(
$request->all(),
[
'currentPassword' => 'required',
'password' => 'required|min:6|confirmed',
]
);
You would expect the rule to be named "NotSame", but it is not. Instead the validation rule is called different.
'password' => 'different:currentPassword'

Laravel Validation: Custom message as array

I'm trying to validate a regular email/password login with some basic rules:
{
$request->validate([
'email' => ['bail', 'required', 'string', 'email', 'exists:users.users,email'],
'password' => ['bail', 'required', 'string', 'password'],
], [
'email.exists' => "Email does not exist in our system"
]);
}
When displaying these errors, it's easy enough to output them below my input:
However, where the "Invalid Email" text is shown within the top right of the input, I'm trying to make that custom, and not a hardcoded string in my component. Ideally, this would also come from the error message - though I have no idea how to approach doing so. In my mind, it would look something like this, but I'm struggling to figure out how to make the Validator accept an array rather than a string. Is this possible?
'email.exists' => ["Invalid email",
"Email does not exist in our system"
]

Laravel validation rules - optional, but validated if present

I'm trying to create a user update validation through form, where I pass, for example 'password'=>NULL, or 'password'=>'newone';
I'm trying to make it validate ONLY if it's passed as not null, and nothing, not even 'sometimes' works :/
I'm trying to validate as :
Validator::make(
['test' => null],
['test' => 'sometimes|required|min:6']
)->validate();
But it fails to validate.
Perhaps you were looking for 'nullable'?
'test'=> 'nullable|min:6'
Though the question is a bit old, this is how you should do it. You dont need to struggle so hard, with so much code, on something this simple.
You need to have both nullable and sometimes on the validation rule, like:
$this->validate($request, [
'username' => 'required|unique:login',
'password' => 'sometimes|nullable|between:8,20'
]);
The above will validate only if the field has some value, and ignore if there is none, or if it passes null. This works well.
Do not pass 'required' on validator
Validate like below
$this->validate($request, [
'username' => 'required|unique:login',
'password' => 'between:8,20'
]);
The above validator will accept password only if they are present but should be between 8 and 20
This is what I did in my use case
case 'update':
$rules = [
'protocol_id' => 'required',
'name' => 'required|max:30|unique:tenant.trackers'.',name,' . $id,
'ip'=>'required',
'imei' => 'max:30|unique:tenant.trackers'.',imei,' . $id,
'simcard_no' => 'between:8,15|unique:tenant.trackers'.',simcard_no,' . $id,
'data_retention_period'=>'required|integer'
];
break;
Here the tracker may or may not have sim card number , if present it will be 8 to 15 characters wrong
Update
if you still want to pass hardcoded 'NULL' value then add the
following in validator
$str='NULL';
$rules = [
password => 'required|not_in:'.$str,
];
I think you are looking for filled.
https://laravel.com/docs/5.4/validation#rule-filled
The relevant validation rules are:
required
sometimes
nullable
All have their uses and they can be checked here:
https://laravel.com/docs/5.8/validation#rule-required
if you want validation to always apply
https://laravel.com/docs/5.8/validation#conditionally-adding-rules
if you want to apply validation rules sometimes
https://laravel.com/docs/5.8/validation#a-note-on-optional-fields
if you want your attribute to allow for null as value too

Laravel Validation one of two fields must be filled

I have two fields:
QQ
Email
How do I set up a Validator object so that one of these fields must be filled? It doesn't matter which.
$messages = array(
'email.required_without:qq' => Lang::get('messages.mustenteremail'),
'email.email' => Lang::get('messages.emailinvalid'),
'qq.required_without:email' => Lang::get('messages.mustenterqq'),
);
required_without should work.
It means that the field is required if the other field is not present. If have more than two fields and only one is required, use required_without_all:foo,bar,...
$rules = array(
'Email' => 'required_without:QQ',
'QQ' => 'required_without:Email',
);
In the example above (given by lucasgeiter) you actually only need one of the conditions not both.
$rules = array(
'Email' => 'required_without:QQ'
);
If you have both rules then filling neither in will result in TWO error messages being displayed. This way it will check that at least one field is filled in and will only display one error message if neither are filled.
Laravel >= 8.32 only support.
Both (mobile or email) are presented simultaneously -> throw an error.
Both (mobile or email) is not present simultaneously -> throw an error.
Allowed
Only one parameter can be allowed.
'email' => [ 'prohibited_unless:mobile,null,','required_without:mobile','email', 'max:255', ],
'mobile' => [ 'prohibited_unless:email,null','required_without:email', 'digits_between:5,13', 'numeric' ],
EDIT: You can also use prohibits:email and prohibits:mobile in combination of required_without:... rule

Categories