maskow/livewire-combined-request
composer require maskow/livewire-combined-request
CombinedFormRequest and define rules(), authorize(), and requiredParameters:
use Maskow\CombinedRequest\CombinedFormRequest;
class StorePostRequest extends CombinedFormRequest {
protected array $requiredParameters = ['user'];
public function rules() { return ['title' => 'required|string']; }
public function authorize() { return true; }
}
public function store(StorePostRequest $request) {
$validated = $request->validated();
// ...
}
public function save() {
$validated = StorePostRequest::validateLivewire($this, ['user' => $this->user]);
// ...
}
Scenario: A form in a Livewire component that needs identical validation to an API endpoint. Solution:
StorePostRequest with shared rules.validateLivewire()) and HTTP controller (automatic validation).authorize() logic across contexts.// Route: POST /posts
Route::post('/posts', [PostController::class, 'store']);
// Controller
public function store(StorePostRequest $request) {
// $request->validated() contains validated data
}
// Component
public function save() {
$validated = StorePostRequest::validateLivewire($this, [
'user' => $this->user,
]);
// $validated matches HTTP validation
}
// Route: PUT /users/{user}/posts/{post}
Route::put('/users/{user}/posts/{post}', [PostController::class, 'update']);
// Controller
public function update(StorePostRequest $request, User $user) {
$user = $request->parameter('user'); // Same as $user from route
}
// Component
public function save() {
$validated = StorePostRequest::validateLivewire($this, [
'user' => $this->user,
'post' => $this->post,
]);
}
public function store(StorePostRequest $request) {
$file = $request->file('image');
// Handle upload
}
public function save() {
$validated = StorePostRequest::validateLivewire($this, [
'user' => $this->user,
], ['image' => $this->image]); // LivewireUploadedFile
}
public function authorize() {
return $this->parameter('user')->can('create', Post::class);
}
// AppServiceProvider
CombinedFormRequest::notifyAuthorizationUsing(function ($component, $message) {
$component->dispatch('alert', ['type' => 'error', 'message' => $message]);
});
// AppServiceProvider
CombinedFormRequest::convertCamelCaseToSnakeCase(true);
public string $firstName = '';
public string $lastName = '';
public function rules() {
return [
'first_name' => 'required', // Automatically maps to $firstName
'last_name' => 'required',
];
}
Missing Required Parameters:
Missing required parameters for App\Http\Requests\StorePostRequest: user.requiredParameters are passed in Livewire:
StorePostRequest::validateLivewire($this, ['user' => $this->user]);
requiredParameters array in your request class.Route Model Binding Mismatch:
requiredParameters names for automatic binding.requiredParameters = ['user'], the route must include {user}.CamelCase Conversion Overhead:
convertCamelCaseToSnakeCase adds minor performance overhead.false by default).Livewire Property Naming:
$emailAddress → email_address in rules.Authorization Failures:
$validated for null.try {
$validated = StorePostRequest::validateLivewire($this, ['user' => $this->user]);
} catch (\InvalidArgumentException $e) {
dd($e->getMessage()); // Debug missing parameters
}
dd(StorePostRequest::validateLivewire($this, ['user' => $this->user]));
dd($request->parameters()); // List all available parameters
Global CamelCase Conversion:
false).true in AppServiceProvider for all requests.CombinedFormRequest and overriding shouldConvertCamelCase().Return Data Format:
getValidatedData() in your request class to return snake_case for database operations.File Handling:
LivewireUploadedFile objects directly in the parameters array.$request->file().Custom Parameter Resolution:
resolveParameter() to add logic for resolving parameters dynamically.protected function resolveParameter($name, $default = null) {
if ($name === 'current_user') {
return auth()->user();
}
return parent::resolveParameter($name, $default);
}
Validation Hooks:
prepareForValidation, withValidator, passedValidation) for cross-context logic.Custom Error Handling:
failedValidation() to customize error responses in Livewire.public static function validateLivewire($component, array $parameters = [], array $data = []) {
try {
$validated = parent::validateLivewire($component, $parameters, $data);
return $validated;
} catch (\Illuminate\Validation\ValidationException $e) {
$component->addErrors($e->errors());
return null;
}
}
Parameter Defaults:
requiredParameters:protected array $requiredParameters = [
'user' => auth()->user(), // Default value
'optional_param' => null,
];
How can I help you explore Laravel packages today?