proengsoft/laravel-jsvalidation
Reuse Laravel validation rules, messages, and FormRequests for automatic client-side form validation—no custom JS required. Built on jQuery Validation with localization support, plus AJAX validation for unique/exists/active_url and custom rules. Supports Laravel 11–13, PHP 8.2–8.4.
Install the Package:
composer require proengsoft/laravel-jsvalidation
Ensure jquery-validation is included in your project (either via npm or CDN).
Publish Assets (if using Laravel Mix/Vite):
npm install jquery-validation --save
Add to your resources/js/app.js or resources/js/bootstrap.js:
import 'jquery-validation';
window.JsValidator = require('jsvalidation');
Include Scripts in Blade:
<!-- jQuery (required) -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<!-- jQuery Validation Plugin (required) -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation/1.19.3/jquery.validate.min.js"></script>
<!-- Laravel JsValidation -->
<script src="{{ asset('vendor/jsvalidation/js/jsvalidation.js') }}"></script>
First Use Case:
Validate a FormRequest in a blade view:
<form method="POST" action="/submit">
@csrf
<!-- Form fields -->
<input type="text" name="email">
</form>
<!-- Auto-generate JS validation -->
{!! JsValidator::formRequest('App\Http\Requests\StoreUserRequest') !!}
FormRequest Validation (Recommended)
FormRequest (e.g., StoreUserRequest).JsValidator::formRequest() in your blade template to auto-generate client-side validation.// app/Http/Requests/StoreUserRequest.php
public function rules() {
return [
'email' => 'required|email|unique:users',
'password' => 'required|min:8',
];
}
<!-- Blade -->
{!! JsValidator::formRequest('App\Http\Requests\StoreUserRequest') !!}
Manual Rule Validation
JsValidator::make() with an array of rules:
{!! JsValidator::make([
'email' => 'required|email',
'password' => 'required|min:8',
], ['email' => 'The email field is required.']) !!}
AJAX Validation for Dynamic Rules
unique, exists, or custom rules trigger AJAX calls to Laravel.config/jsvalidation.php:
'ajax' => [
'unique' => '/api/check-unique',
'exists' => '/api/check-exists',
],
Integration with Laravel Collective
@error directives and Form::open():
{!! Form::open(['id' => 'my-form']) !!}
{!! JsValidator::formRequest('App\Http\Requests\StoreUserRequest') !!}
{!! Form::close() !!}
Custom Rule Support
JsValidator to support custom rules by implementing JsValidatorRule:
JsValidator::extend('custom_rule', function ($field, $parameters, $validator) {
return "function(element, parameters, value) {
return value === 'custom';
}";
});
Dynamic Form Handling
JsValidator::partial() for dynamically loaded forms (e.g., modals):
{!! JsValidator::partial('App\Http\Requests\UpdateUserRequest', 'update-form') !!}
Localization
app()->getLocale().resources/lang/{locale}/validation.php.Conditional Validation
sometimes or required_if rules in FormRequest:
public function rules() {
return [
'password' => ['required_if' => 'update_password', 'min:8'],
];
}
Unsupported Rules
present, date_format (with timezones), or confirmed may not work client-side.AJAX Rule Failures
unique or exists require AJAX endpoints. If misconfigured, validation fails silently./api/check-unique routes.jQuery Dependency
jsvalidation.js.FormRequest Caching
FormRequest classes. Clear cache (php artisan cache:clear) if rules change but JS validation doesn’t update.Date Comparison Issues
before:today or after:yesterday may fail in JS due to date parsing quirks.YYYY-MM-DD) or extend the rule with custom JS logic.Inspect Generated JS
F12) and check the <script> tag generated by JsValidator::formRequest(). Look for malformed rules or missing fields.Disable AJAX for Testing
config/jsvalidation.php:
'ajax' => false,
Log Validation Errors
FormRequest to log client-side errors:
public function failedValidation(Validator $validator) {
\Log::error('Validation errors:', $validator->errors()->toArray());
}
Check for Conflicting JS
$.validator methods.Custom Rule Templates
resources/views/vendor/jsvalidation/.resources/views/vendor/jsvalidation/rules/custom_rule.js:
function(element, parameters, value) {
return value.match(/^custom_/);
}
Modify AJAX Responses
app/Providers/AppServiceProvider.php:
use Proengsoft\JsValidation\JsValidator;
public function boot() {
JsValidator::ajaxHandler(function ($request) {
return response()->json([
'valid' => true,
'message' => 'Custom response',
]);
});
}
Disable Default Messages
config/jsvalidation.php:
'messages' => false,
JsValidator::make() or override translations.Integrate with Alpine.js/Vue
JsValidator::partial() for dynamic components:
<template x-data="{ open: false }">
<div x-show="open">
<form x-ref="dynamicForm">
{!! JsValidator::partial('App\Http\Requests\DynamicRequest', 'dynamicForm') !!}
</form>
</div>
</template>
How can I help you explore Laravel packages today?