I had the same problem too
adding error to Validator doesn't make It to fail, so you need to make a trap for It that forces It to, maybe a required input that doesn't even exist...
but that will make a confusing error for user (example: unreal_input is required),
you'd easily change the message to explain what actually made you to fail the process...
$req = Request::all();
$rules = [/*...*/];
if(/*something's wrong*/){
$rules['unreal_input'] = 'required'; // a confusing error in your errors list...
$messages['unreal_input.required'] = '/* explain the real problem in here*/';
}
$validator = Validator::make($req, $rules,$messages);
if ($validator->fails()) return redirect()->back()->withErrors($validator)->withInput();
so in the code above you've manually checked if something's wrong, then you've made a trap for Validator, then you've changed the message to what the real problem was.
NOTE: I suggest you to use a random value instead of something like unreal_input , because If you do this, the user may(?) guess the input's name, and easily using F12 he/she would pass the validation and give some invalid data to you