FormTypeObjectRequest
The FormTypeObjectRequest trait provides helper methods to populate validation rules and attribute names based on form custom fields. It can be used in any FormRequest class that works with forms.
Namespace
JobMetric\Form\Http\Requests\FormTypeObjectRequest
Overview
The FormTypeObjectRequest trait provides two methods that can be called from within your FormRequest classes to automatically populate validation rules and attribute names from a form instance. This is useful when you want to use form-based validation in custom request classes.
Available Methods
Render Form Field
Populate validation rules based on form custom fields:
public function renderFormFiled(array &$rules, Form|null $form): void
Parameters:
$rules(array): Reference to the rules array to be filled$form(Form|null): The form instance
Returns: void
Note: If $form is null, the method returns early without modifying rules.
Render Form Attribute
Populate attribute names based on form custom fields:
public function renderFormAttribute(array &$params, Form|null $form): void
Parameters:
$params(array): Reference to the attributes map to be filled$form(Form|null): The form instance
Returns: void
Note: If $form is null, the method returns early without modifying attributes.
Basic Usage
In FormRequest
use Illuminate\Foundation\Http\FormRequest;
use JobMetric\Form\Form;
use JobMetric\Form\Http\Requests\FormTypeObjectRequest;
class StoreUserRequest extends FormRequest
{
use FormTypeObjectRequest;
public function rules(): array
{
$rules = [];
// Get form instance (from service, cache, etc.)
$form = $this->getFormInstance();
// Populate rules from form
$this->renderFormFiled($rules, $form);
// Add custom rules if needed
$rules['password_confirmation'] = 'required|same:password';
return $rules;
}
public function attributes(): array
{
$attributes = [];
$form = $this->getFormInstance();
// Populate attributes from form
$this->renderFormAttribute($attributes, $form);
return $attributes;
}
protected function getFormInstance(): Form
{
// Get form from service, cache, or build it
return app(FormService::class)->getUserForm();
}
}
Complete Examples
Custom Request with Form Integration
use Illuminate\Foundation\Http\FormRequest;
use JobMetric\Form\Form;
use JobMetric\Form\FormBuilder;
use JobMetric\Form\Http\Requests\FormTypeObjectRequest;
class UpdateProductRequest extends FormRequest
{
use FormTypeObjectRequest;
public function authorize(): bool
{
return $this->user()->can('update', Product::find($this->route('product')));
}
public function rules(): array
{
$rules = [];
$form = $this->buildForm();
// Populate rules from form
$this->renderFormFiled($rules, $form);
// Override or add custom rules
$rules['slug'] = 'required|string|unique:products,slug,' . $this->route('product');
return $rules;
}
public function attributes(): array
{
$attributes = [];
$form = $this->buildForm();
// Populate attributes from form
$this->renderFormAttribute($attributes, $form);
return $attributes;
}
protected function buildForm(): Form
{
return FormBuilder::make()
->action(route('products.update', $this->route('product')))
->method('PUT')
->tab(function ($tab) {
$tab->id('basic')
->label('Basic Information')
->group(function ($group) {
$group->label('Details')
->customField(function ($field) {
$field->text()
->name('name')
->label('Product Name')
->validation('required|string|max:255')
->build();
})
->customField(function ($field) {
$field->text()
->name('slug')
->label('Slug')
->validation('required|string|max:255')
->build();
})
->build();
})
->build();
})
->build();
}
}
When to Use FormTypeObjectRequest
Use the FormTypeObjectRequest trait when you need to:
- Custom Request Classes: Use form-based validation in custom request classes
- Additional Logic: Add custom validation logic alongside form-based rules
- Authorization: Implement custom authorization logic
- Flexibility: Have more control over validation than
FormBuilderRequestprovides - Mixed Validation: Combine form-based and custom validation rules