Laravel validation rules - regex - laravel-5

I need to use Laravel Validation with regex that allow string as 1,2,3,7
Some as this:
$arr_rules = [ 'order' => 'min:3|regex:[0-9+,]',
...
];

Try this:
$arr_rules = [ 'order' => 'min:3|regex:^([0-9]+\,+)*[0-9]+$',
...
];

Related

Laravel: custom array validation depends on previous selected value

Laravel version: 7.x
I have tested the code with hard-coded valid device_company_id (which is associated with the selected device) and it works fine.
Tables
device_companies
|- id
|- company_id
|- title
|- ...
devices
|- id
|- device_company_id
|- ...
Request data
Array
(
...
[devices] => Array
(
[0] => Array
(
[device_company_id] => 1
[device_id] => 2
[device_inventory_id] => null
[amount] =>
[refundable] =>
[description] =>
)
)
)
Rules:
...
$rules = array_merge($rules, [
'devices' => [
'required',
'array'
],
'devices.*.device_company_id' => [
'required',
'integer',
'exists:device_companies,id,company_id,' . auth()->user()->id
],
'devices.*.device_id' => [
'required',
'integer',
'exists:devices,id,device_company_id,devices.*.device_company_id'
],
]);
...
I need a custom validation rule for the exists validator to validate if device actually belongs the selected device_company or not. Because I don't want anyone opening the inspect tool, change the value and causing the application an error or anything like that.
Here is the link where I found the reference https://ericlbarnes.com/2015/04/04/laravel-array-validation/
My code:
...
$rules = [
...other rules
];
$newRules = [
'devices' => [
'required',
'array'
],
'devices.*.device_company_id' => [
'required',
'integer',
'exists:device_companies,id,company_id,' . auth()->user()->id
],
];
foreach($data['devices'] as $key => $array)
{
$newRules["devices.{$key}.device_id"] = [
'required',
'integer',
"exists:devices,id,device_company_id,{$array["device_company_id"]}",
];
}
$rules = array_merge($rules, $newRules);
...
Although, this code is working for me but I feel its not the proper way to do it. It feels kind of a way around instead of the proper solution. If anyone finds a better solution then please do post your answer.
Hope this can be helpful for someone. Thanks :)

Validate a single variable or an array in Laravel

I want to validate a single variable like this $name = "example name" but I didn't a way to handle it then I decided to convert it to an array like this $nameArr = ['name' => 'example name'];, the validator is
$rules =
$this->validate($nameArr, [
'name' => 'required|max:10|regex:/^[a-zA-Z0-9]+$/u',
], [
'name.required' => 'name is empty',
'name.max' => 'name must be more less than 10 letters',
'name.regex' => 'invalid name'
]
);
but the Laravel gives this error
Argument 1 passed to App\Http\Controllers\Controller::validate() must be an instance of Illuminate\Http\Request, string given
Correct, the validate function on Controller comes from Illuminate\Foundation\Validation\ValidatesRequests and requires the first paramter to be a request object.
If you want to validate an array, you will have to create the validator manually.
$validator = Validator::make($nameArr,
[
'name' => 'required|max:10|regex:/^[a-zA-Z0-9]+$/u',
],
[
'name.required' => 'name is empty',
'name.max' => 'name must be more less than 10 letters',
'name.regex' => 'invalid name'
]
);
if ($validator->fails()) {
dd($validator->errors());
}
After knowing that the parameter is passed as route url param, I would like to add another option which Laravel provides to validate :
Route::get('user/{name}', 'UserProfileController#getByName')
->where([ 'name' => '[a-z]{10,}' ]);
The where method validates the route param based on provided regular expressions. So [a-z]{10,} will make sure the name is present with 10 or more characters.
See documentation for more

How to mix $query->andFilterWhere and $query->query in Yii2 elasticsearch 6

I updated my yii2 system from yii2-elasticsearch 2.0 to 2.1 and elasticsearch package from 2.2.1 to 6.2.1. In the old system I could mix $query->andFilterWhere and $query->query as follows (the search method is in a class derived from yii\elasticsearch\ActiveRecord):
public function search($params)
{
$query = self::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
$query->andFilterWhere([
'languageCode' => \Yii::$app->locale->languageCode,
]);
$queryPart = [];
if (!empty($this->term)) {
$queryPart['filtered']['query']['multi_match'] = [
// ES6: $queryPart['bool']['must']['multi_match'] = [
'query' => $this->term,
'operator' => 'and',
'type' => $this->getQueryType($this->term),
'fields' => [
'name_*',
'meta_description_*'
]
];
}
if (!empty($queryPart)) {
$query->query($queryPart);
}
return $dataProvider;
}
It worked with ES 2.2.1 without any problem, but now the andFilterWhere overwrites $query->query independently from the sequence. If one of the two parts is removed the other filter works perfectly, only together not.
Any idea?
You must use bool query and put all part of your query in one "query" object...
Something like this:
query => [
bool => [
must => [
multi_match => [
'query' => $this->term,
'operator' => 'and',
'type' => $this->getQueryType($this->term),
'fields' => [
'name_*',
'meta_description_*'
]
]
]
filter => [
'languageCode' => \Yii::$app->locale->languageCode
]
]
]
This problem seems to be bug, as confirmed by other users on github.

Laravel 5 validation append to rule

I'm using Laravel 5.4 and I have 2 date fields. The first is required and the second is optional.
I'm having problems with the validation when the second date field is empty.
I understand why but only want to run the before_or_equal rule if the second date is not empty
$this->validate($request, [
'start_date' => 'required|date|before_or_equal:end_date',
'end_date' => 'nullable|bail|date|after_or_equal:start_date',
]);
How can I update my code ignore the rule if the date field is empty?
I did think about this
if($request->has('end_date')) {
//do something
}
The only other option is to create a custom validation rule and compare the dates
No need to put both condition remove |before_or_equal:end_date from start_date. Only after_or_equal:start_date would work
Use required_with:foo,bar,...
Try like this
$this->validate($request, [
'start_date' => 'required|date',
'end_date' => 'required_with:start_date|nullable|bail|date|after_or_equal:start_date',
]);
I would do it like this:
$rules = [
'start_date' => 'required|date|before_or_equal:end_date',
];
if ($request->get('end_date') != '') {
$rules['end_date'] = 'required|date|after_or_equal:start_date';
}
$this->validate($request, $rules);

Validating Matching Strings

When I use the Validation feature in Laravel, how can I add a pre-defined strings that are allowed in an Input?
For example, let's say I want the Input to contain only one of the following: foo,bar,baz, how can I do that?
$validator = Validator::make($credentials, [
'profile' => 'required|max:255', // Here I want Predefined allowed values for it
]);
Best to use the 'in' validation rule like this:
$validator = Validator::make($credentials, [
'profile' => ["required" , "max:255", "in:foo,bar,baz"]
]);
It is recommended in Laravel docs to put the validation rules in an array when they get bigger and I thought 3 rules were sufficient. I think it makes it for a more readable content but you do not have to. I added the regex portion below and I have it works. I am not that great with regexing stuff. Let me know.
$validator = Validator::make($credentials, [
'profile' => ["required" , "max:255", "regex:(foo|bar|baz)"]
]);
Works for me in Laravel 9:
use Illuminate\Validation\Rule;
 
Validator::make($data, [
'toppings' => [
'required',
Rule::notIn(['sprinkles', 'cherries']),
],
]);
Docs: https://laravel.com/docs/9.x/validation#rule-not-in
For the opposite you could use Rule::in(['foo', 'bar', 'baz'])

Resources