I need to make a custom validation rule where for these three inputs where net_weight = loaded_weight - empty_weight
<fieldset >
<div >
<label for="text">empty weight</label>
<input type="number" id="empty_weight"
name="empty_weight" min="15000" max="35000" step="20" oncopy="return false"
onpaste="return false">
</div>
</fieldset>
<fieldset>
<legend >loaded weight</legend>
<div >
<input type="number" id="loaded_weight"
name="loaded_weight" min="35000" max="120000" maxlength="6" step="20"
oncopy="return false" onpaste="return false">
</div>
</fieldset>
<fieldset>
<legend >net weight</legend>
<div >
<input type="number" id="net_weight"
name="net_weight" maxlength="5" step="20" oncopy="return false"
onpaste="return false">
</div>
</fieldset>
CodePudding user response:
Create yourself a custom validation rule using:
php artisan make:rule EqualToNetWeight
That will create a new Rule
class named EqualToNetWieght
at app/Rules
:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class EqualToNetWeight implements Rule
{
private $loadedWeight;
private $emptyWeight;
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct($loadedWeight, $emptyWeight)
{
$this->loadedWeight = $loadedWeight;
$this->emptyWeight = $emptyWeight;
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return $value == $this->loadedWeight - $this->emptyWeight;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The net weight does not equal the loaded weight minus the empty weight.';
}
}
I've customised the messages()
function to be more appropriate and descriptive for this use case.
The passes()
function is where we perform the validation checking, in this case that your calculation (net weight == loaded weight - empty weight
) passes and return the result (true
or false
) of that calculation.
The values of loaded weight
and empty weight
are accepted via the constructor()
function.
To use the rule you would do something like:
'net_weight' => [
'required',
new EqualToNetWeight($request->loaded_weight, $request->empty_weight)
]