I have the following validation code in a controller. The problem is that laravel is sending the column name in the validation error , which is most of the time abbreviations. In this case the column name is "ans". Is there a way to show a different name to the user ?
Validation :
$this->validate($request, [
'ans' => 'required|max:5000|min:10'
]);
Error :
The ans field is required.
If you want to customize the attribute name you can do that; you don't have to customize the message to do this. The validate method takes an array of "custom attribute names" to use (4th argument), just like it takes an array of custom messages (3rd argument).
$this->validate(
$request,
['ans' => 'required|max:5000|min:10'], // rules
[], // custom messages
['ans' => 'Answer'] // custom attribute names
);
You should always have the option to specify custom messages and attributes with the validation methods that are available. These custom attribute names get replaced in the messages where :attribute is used.
If you don't do it this way you would have to create 3 custom messages, one for each rule you have defined to use for your field 'ans', since any of those rules could fail and will include the attribute name.
Yes, you can achieve with the following code.
$this->validate($request, [
'ans' => 'required|max:5000|min:10'
], [
'ans.required' => 'The answer field is required.'
]);
Take a look at the laravel documentation to know more.
You can send custom validation message,define all
your validation message in a variable like this
$messages = [
'ans.required' => 'The answer field is required.'
]
$this->validate($request, [
'ans' => 'required|max:5000|min:10'
], $messages);
Thanks
Related
I need to validate that a customer is using a valid subdomain name as well as making sure some other required fields are present. I have created the following rule in my model class:
public function rules()
{
return array(
array(',c_customerSubdomain, c_custAdminUser,c_adminPassword,c_adminContact', 'required', 'message' => "{attribute} is TEST required."),
array('c_customerSubdomain', 'match', 'pattern' => '/^[a-z0-9_]*$/', 'message' => "Customer Subdomain should contain only alphanumeric and underscore.", "allowEmpty" => false),
);
}
I am testing whether or not the rule is firing by changing the message for required values to: {attribute} is TEST required.
When I submit the form with all of the field blank, the result is as expected.
However, when I populate the field for subdomain with an illegal value, such as "ASD# a", I am expecting to get a validation error. However, instead, the rules bypass all of the other validation errors and attempt to save the model.
I have a form which has an input name. I want to update a database table through that form. The only condition is, the name must be unique. So this is what I did for validation in the backend:
$this->validate($request, [
'name' => 'required|unique:myTableName'
]);
It's working as expected. It throws this error "The name has already been taken." when I try to enter a name which already exists in the database. But the problem I have with this is, when I'm updating the same entry from database without any change (I.E. I go to edit form, do nothing, update the form), it shows me the same error. In this case, I don't want the error as I'm updating the same value. How can I achieve this with laravel validation?
You have to use following code
$this->validate($request, [
'name' => ['required', Rule::unique('myTableName')->ignore($yourVariable->id)],
]);
Add header section below code
use Illuminate\Validation\Rule;
More Details here
You need to pass the table id, to ignore that field from validation
'name' => 'required|unique:myTableName,name,' . $table->id,
With custom Rule :
use Illuminate\Validation\Rule;
'name' => ['required', Rule::unique('myTableName', 'name')->ignore($table->id)],
Hy! how can i use the not equal in validation
i'm using laravel 5.8. i want to do when i put the (name) something like Admin in input field at the submission of the form it show me error the You can't Use the Name Admin This is all for guest use. when the user is login the he/she can add this name
Laravel offers notIn validation rule for this:
Validator::make($data, [
'name' => [
'required',
Rule::notIn(['Admin']), // You can add more values to the array to black list it.
],
]);
Read more about this here.
I have made a custom rule in Laravel 5.5, but also want to get a custom translation with it from the lang validation file. For that I have now done:
'custom' => [
'validate' => [
'correct_password' => 'The :attribute is incorrect.',
],
],
And I put this in the custom rule file:
return trans('validate.correct_password');
What have I done wrong to get the custom message? Because I get now only back the key: validate.correct_password as a message.
If you want to pull a key from the translation file, then you need to pass it a key path in the form of file.key.subkey.subkey.
return trans('validation.custom.validate.correct_password');
Is there a simple way to replace the input name in Laravel's validation messages with for example a label?
Right now message is like:
The usrRoleId field is required.
I know there are two options:
Change input names to more readable.
Write EACH message in the validation request to look like this: User Role is required.
I'm looking for something more automatic - like defining a string once and using it every time such field name is used.
Yes you can and it's actually quite easy. You can specify a custom name for a given attribute in your resources/lang/en/validation.php file under the attributes key:
'attributes' => [
'usrRoleId' => 'User Role'
],
And now anywhere you have usrRoleId for the :attribute inside a validator message, it will be replaced with User Role. So instead of:
The usrRoleId field is required.
You'll get the nice:
The User Role field is required.
If you want to have a whole custom message not only a custom attribute name for when the usrRoleId is required, then you can add an entry for that user the custom key in the same file. So adding this:
'custom' => [
'usrRoleId' => [
'required' => 'User Role is required',
],
],
Will use that custom message but without an :attribute placeholder. If you want to use the placeholder you can leave the attributes mapping I described above:
'custom' => [
'usrRoleId' => [
'required' => ':attribute is required',
],
],
And you'll still get your custom message but with the mapped attribute name:
User Role is required.