proengsoft/laravel-jsvalidation
Reuse Laravel validation rules, messages, and FormRequests for automatic client-side form validation—no custom JS needed. Built on jQuery Validation, supports localization and most rules, with AJAX checks for unique/exists/active_url and custom rules.
Installation:
composer require proengsoft/laravel-jsvalidation
Publish the config (if needed):
php artisan vendor:publish --provider="Proengsoft\JsValidation\JsValidationServiceProvider"
Include Dependencies: Add jQuery and Bootstrap JS to your layout (or use a CDN):
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
Load the Package JS:
<script src="{{ asset('vendor/jsvalidation/js/jsvalidation.js') }}"></script>
First Use Case:
Validate a FormRequest in a view:
{!! JsValidator::formRequest('App\Http\Requests\StoreUserRequest') !!}
Ensure your StoreUserRequest extends Illuminate\Foundation\Http\FormRequest and defines rules in rules().
FormRequest Validation (Recommended)
FormRequest (e.g., StorePostRequest):
public function rules()
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
'published_at' => 'nullable|date',
];
}
{!! JsValidator::formRequest('App\Http\Requests\StorePostRequest') !!}
validate() in your controller to ensure server-side consistency.Manual Rule Validation
For forms not tied to a FormRequest, use JsValidator::make():
{!! JsValidator::make($request->all(), [
'email' => 'required|email',
'password' => 'required|min:8',
]) !!}
AJAX-Enabled Rules
Rules like unique, exists, or custom rules trigger AJAX calls. Example:
// StoreUserRequest.php
public function rules()
{
return [
'email' => 'required|email|unique:users,email',
];
}
The package auto-generates AJAX endpoints (e.g., /jsvalidation/unique/users/email).
Dynamic Forms
For dynamic fields (e.g., added via JavaScript), use JsValidator::partial():
<div id="dynamic-fields">
<!-- Fields added here -->
</div>
<script>
JsValidator.partial('dynamic-fields', {
rules: { 'dynamic-field' => 'required|string' }
});
</script>
@error directives in Blade:
<x-input name="email" :error="old('email', $errors->first('email'))" />
v-model or controlled components. The package attaches validation to name attributes.lang/validation.php. Override in your app’s language files.Unsupported Rules
present and date_format (timezone-specific) are not client-side validated. Handle these server-side.passes() and message() for AJAX to work. Example:
public function passes($attribute, $value)
{
return Str::is('admin', $value);
}
public function message()
{
return 'The :attribute must be "admin".';
}
AJAX Endpoint Conflicts
/jsvalidation/unique:table,column) don’t conflict with your app’s routes. Use middleware to restrict access:
Route::middleware(['web', 'auth'])->group(function () {
// Your routes
});
jQuery Dependency
Dynamic Field Timing
JsValidator.partial() or manually trigger validation:
$('#my-form').validate().element('#dynamic-field');
Uncaught TypeError (e.g., missing jQuery or malformed rules).@csrf directive in forms.php artisan jsvalidation:dump-rules to debug.Custom Rule Support
Extend the package to support custom rules by implementing Proengsoft\JsValidation\Contracts\Rule:
class CustomRule extends Rule
{
public function getJsValidation()
{
return 'function(value) { return value === "custom"; }';
}
}
Override Defaults
Customize the jQuery Validation plugin settings in config/jsvalidation.php:
'jquery_validation' => [
'rules' => [
'custom_rule' => 'function(value) { return value.length > 10; }',
],
'messages' => [
'custom_rule' => 'Must be longer than 10 characters.',
],
],
Exclude Fields
Skip validation for specific fields by adding data-skip-validation="true" to the input:
<input name="temp_field" data-skip-validation="true">
Event Hooks Listen to validation events via JavaScript:
$(document).on('jsvalidation:validate', function(e, validator) {
console.log('Validation started:', validator);
});
How can I help you explore Laravel packages today?