maskow/livewire-combined-request
composer require maskow/livewire-combined-request
// app/Http/Requests/UpdatePostRequest.php
class UpdatePostRequest extends CombinedFormRequest {
protected array $requiredParameters = ['post'];
public function rules() { return ['title' => 'required|string']; }
}
// In Livewire component
$validated = UpdatePostRequest::validateLivewire($this, ['post' => $this->post]);
// In HTTP controller
public function update(UpdatePostRequest $request, Post $post) { ... }
Route::put('/posts/{post}', [PostController::class, 'update']);
UpdatePostRequest::validateLivewire($this, ['post' => $this->post]);
post from routepost model$request->parameter('post') in both contextsauthorize() method handles both HTTP and Livewire
public function authorize() {
return $this->parameter('post')->user_id === auth()->id();
}
public function rules() {
return ['image' => 'required|image|mimes:jpeg,png'];
}
AppServiceProvider:
CombinedFormRequest::convertCamelCaseToSnakeCase(true);
firstName) automatically map to snake_case rules (first_name)CombinedFormRequest::notifyAuthorizationUsing(function($component, $message) {
$component->dispatch('notify', ['type' => 'error', 'message' => $message]);
});
Missing Parameters:
// ❌ Will throw exception
UpdatePostRequest::validateLivewire($this);
// ✅ Correct
UpdatePostRequest::validateLivewire($this, ['post' => $this->post]);
CamelCase Conversion:
CombinedFormRequest::convertCamelCaseToSnakeCase(true);
Route Model Binding:
$requiredParametersposts/{post} for ['post'] requirementLivewire Property Names:
firstName → first_name rule, but errors show firstNameParameter Inspection:
dd($this->parameters()); // Check all available parameters
dd($this->parameter('post')); // Inspect specific parameter
Validation Debugging:
try {
$validated = UpdatePostRequest::validateLivewire($this, ['post' => $this->post]);
} catch (\Illuminate\Validation\ValidationException $e) {
dd($e->errors()); // Inspect validation errors
}
Authorization Debugging:
authorize() to return true for testingdd($this->parameter('post'))Custom Parameter Resolution:
resolveParameter() in your request class:
protected function resolveParameter(string $name, $default = null) {
return $this->customLogic($name, $default);
}
Data Transformation:
prepareForValidation() to modify data before validation:
protected function prepareForValidation() {
$this->merge(['slug' => Str::slug($this->title)]);
}
Post-Validation Logic:
passedValidation() for side effects:
protected function passedValidation() {
activity()->log('Post updated', ['post_id' => $this->parameter('post')->id]);
}
Global Configuration:
AppServiceProvider:
CombinedFormRequest::setDefaultDataFormat('camelCase'); // or 'snake_case'
Unit Test Validation:
public function test_validation_rules() {
$request = new UpdatePostRequest();
$request->merge(['title' => '']);
$this->assertFalse($request->validate());
}
Livewire Test Double:
$component = new EditPostComponent();
$component->post = $post;
$validated = UpdatePostRequest::validateLivewire($component, ['post' => $post]);
Authorization Testing:
$request = new UpdatePostRequest();
$request->setParameter('post', $post);
$this->assertFalse($request->authorize());
How can I help you explore Laravel packages today?