For some reason, only now I've found out about a feature that was introduced in Laravel 5.5 - artisan command that makes your validation rule, similar to Request classes. Let's see it in action.
Let's take an example of a form to fill in Summer Olympic Games events - so year and city:
Now, let's create a validation rule that you can enter only the year of Olympic Games:
  - Games started in 1896
 
  - Year can't be bigger than current year
 
  - Number should be divided by 4
 
Let's run a command:
php artisan make:rule OlympicYear
Laravel generates a file app/Rules/OlympicYear.php:
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class OlympicYear implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //
    }
    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The validation error message.';
    }
}
As I said, it's similar to Requests classes for validation. We fill in the methods. passes() should return true/false depending on $value condition, which is this in our case:
public function passes($attribute, $value)
{
    return $value >= 1896 && $value <= date('Y') && $value % 4 == 0;
}
Next, we fill in the error message to be this:
public function message()
{
    return ':attribute should be a year of Olympic Games';
}
Finally, how we use this class? In controller's store() method we have this code:
public function store(Request $request)
{
    $this->validate($request, ['year' => new OlympicYear]);
}
Pay attention to syntax, second parameter should be an array and then we create a new object from our Rule class.
That's it!
                                                
         
No comments or questions yet...