DEV Community

Cover image for Latest Tips & Tricks About Laravel Validation & Laravel Routing
sumyya khan
sumyya khan

Posted on

Latest Tips & Tricks About Laravel Validation & Laravel Routing

Laravel is an open-source PHP framework devised to make developing web apps easier and faster through built-in features. These features are part of what makes Laravel so widely used by web developers.
Laravel includes a wide variety of beneficial validation rules that you can apply to data, even providing the ability to validate if values are unique in a given database table. Routing in Laravel allows you to route all your application requests to their appropriate controller. In this article, I will show you some laravel validation and routing tips. Hopefully, you can use them to supercharge your Laravel applications. Here we go!

Position placeholder in the validation messages

In Laravel 9 you can use the :position placeholder in the validation messages if you're working with arrays.

This will output: "Please provide an amount for price #2"

class CreateProductRequest extends FormRequest
{
    public function rules(): array
    {
        return  [
            'title' => ['required', 'string'];
            'description' => ['nullable', 'sometimes', 'string'],
            'prices' => ['required', 'array'],
            'prices.*.amount' => ['required', 'numeric'],
            'prices.*.expired_at' => ['required', 'date'],
        ];
    }

    public function messages(): array
    {
        'prices.*.amount.required' => 'Please provide an amount for price #:position'
    }
}
Enter fullscreen mode Exit fullscreen mode

New array validation rule required_array_keys

Laravel 8.82 adds a required_array_keys validation rule. The rule checks that all of the specified keys exist in an array.

Valid data that would pass the validation:

$data = [
    'baz' => [
        'foo' => 'bar',
        'fee' => 'faa',
        'laa' => 'lee'
    ],
];

$rules = [
    'baz' => [
        'array',
        'required_array_keys:foo,fee,laa',
    ],
];

$validator = Validator::make($data, $rules);
$validator->passes(); // true
Enter fullscreen mode Exit fullscreen mode

Invalid data that would fail the validation:

$data = [
    'baz' => [
        'foo' => 'bar',
        'fee' => 'faa',
    ],
];

$rules = [
    'baz' => [
        'array',
        'required_array_keys:foo,fee,laa',
    ],
];

$validator = Validator::make($data, $rules);
$validator->passes(); // false
Enter fullscreen mode Exit fullscreen mode

Route resources grouping

If your routes have a lot of resource controllers, you can group them and call one Route::resources() instead of many single Route::resource() statements.

Route::resources([
    'photos' => PhotoController::class,
    'posts' => PostController::class,
]);
Enter fullscreen mode Exit fullscreen mode

Custom route bindings

Did you know you can define custom route bindings in Laravel?

In this example, I need to resolve a portfolio by slug. But the slug is not unique, because multiple users can have a portfolio named Foo. So I define how Laravel should resolve them from a route parameter

class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/dashboard';

    public function boot()
    {
        Route::bind('portfolio', function (string $slug) {
            return Portfolio::query()
                ->whereBelongsto(request()->user())
                ->whereSlug($slug)
                ->firstOrFail();
        });
    }
}
Route::get('portfolios/{portfolio}', function (Portfolio $portfolio) {
    /*
     * The $portfolio will be the result of the query defined in the RouteServiceProvider
     */
})
Enter fullscreen mode Exit fullscreen mode

Mac validation rule

New mac_address validation rule added in Laravel 8.77

$trans = $this->getIlluminateArrayTranslator();
$validator = new Validator($trans, ['mac' => '01-23-45-67-89-ab'], ['mac' => 'mac_address']);
$this->assertTrue($validator->passes());
Enter fullscreen mode Exit fullscreen mode

Validate email with TLD domain required

By default, the email validation rule will accept an email without a TLD domain (ie: taylor@laravel, povilas@ldaily)

But if you want to make sure the email must have a TLD domain (ie: taylor@laravel.com, povilas@ldaily.com), use the email:filter rule.

[
    'email' => 'required|email', // before
    'email' => 'required|email:filter', // after
],
Enter fullscreen mode Exit fullscreen mode

Route view

You can use Route::view($uri , $bladePage) to return a view directly, without having to use the controller function.

//this will return home.blade.php view
Route::view('/home', 'home');
Enter fullscreen mode Exit fullscreen mode

These are some useful tips and tricks related to laravel Validation & Routing. I hope that by utilizing these tips, you will improve your code execution and usability. If you love them, then please follow us for more laravel & Vue js related news.

Follow Us on Twitter:

Discussion (0)