StoreFlowTaskRequest
Form request class for validating FlowTask creation data. This request handles dynamic validation based on the selected task driver, including driver-specific configuration validation.
Namespace
JobMetric\Flow\Http\Requests\FlowTask\StoreFlowTaskRequest
Overview
The StoreFlowTaskRequest validates incoming data when creating a new FlowTask entity. It ensures:
- Required fields are present
- Flow transition ID exists and is valid
- Driver class exists and is registered
- Driver-specific configuration is valid
- Dynamic form validation from driver's form definition
Key Features
- Dynamic Validation: Rules are generated based on the selected driver
- Driver Registration Check: Validates that driver is registered in FlowTaskRegistry
- Form Builder Integration: Uses driver's form definition for config validation
- Context Support: Supports external context injection
Validation Rules
Required Fields
| Field | Rule | Description |
|---|---|---|
flow_transition_id | required|integer|exists:flow_transitions,id | ID of the parent transition |
driver | required|string | Fully qualified driver class name |
driver (custom) | Class exists, extends AbstractTaskDriver, registered | Driver validation checks |
Optional Fields
| Field | Rule | Description |
|---|---|---|
config | sometimes|array | Driver-specific configuration |
config.* | Dynamic rules from driver's form | Validated based on driver's form definition |
ordering | sometimes|nullable|integer|min:0 | Task execution order |
status | sometimes|boolean | Active/inactive status |
Driver Validation
The driver field is validated with custom rules:
-
Class Exists: The class must exist
// ✅ Valid
'driver' => 'App\FlowTasks\SendEmailTask'
// ❌ Invalid
'driver' => 'App\FlowTasks\NonExistentTask' -
Extends AbstractTaskDriver: Must extend the base driver class
// ✅ Valid
class SendEmailTask extends AbstractTaskDriver { }
// ❌ Invalid
class SendEmailTask { } -
Registered in Registry: Must be registered in FlowTaskRegistry
// ✅ Valid - Registered
FlowTaskRegistry::register(SendEmailTask::class);
// ❌ Invalid - Not registered
// Driver not registered
Dynamic Config Validation
The config field is validated based on the driver's form definition:
// If driver defines form:
public function form(): array
{
return [
'recipient' => ['required', 'email'],
'subject' => ['required', 'string', 'max:255'],
'template' => ['required', 'string'],
];
}
// Then config is validated as:
'config.recipient' => 'required|email',
'config.subject' => 'required|string|max:255',
'config.template' => 'required|string',
Context Management
The request supports external context injection:
$request = new StoreFlowTaskRequest();
$request->setContext(['flow_id' => 123]);
The flow_id is automatically extracted from the transition and stored in context.
Static Rules Method
rulesFor()
Provides programmatic validation:
$input = [
'flow_transition_id' => 1,
'driver' => 'App\FlowTasks\SendEmailTask',
'config' => [
'recipient' => 'user@example.com',
],
];
$context = [];
$rules = StoreFlowTaskRequest::rulesFor($input, $context);
Usage Examples
Basic Task Creation
use JobMetric\Flow\Http\Requests\FlowTask\StoreFlowTaskRequest;
use JobMetric\Flow\Facades\FlowTask;
public function store(StoreFlowTaskRequest $request)
{
$validated = $request->validated();
$task = FlowTask::store(
$validated['flow_transition_id'],
$validated
);
return response()->json($task, 201);
}
Complete Request Data
$requestData = [
'flow_transition_id' => 1,
'driver' => 'App\FlowTasks\SendEmailTask',
'config' => [
'recipient' => 'user@example.com',
'subject' => 'Order Confirmation',
'template' => 'order-confirmation',
],
'ordering' => 1,
'status' => true,
];
Minimal Request Data
$requestData = [
'flow_transition_id' => 1,
'driver' => 'App\FlowTasks\LogTask',
// config is optional if driver doesn't require it
];
With Driver-Specific Config
// For a validation task
$requestData = [
'flow_transition_id' => 1,
'driver' => 'App\FlowTasks\ValidateOrderTask',
'config' => [
'min_amount' => 100,
'required_fields' => ['customer_name', 'address'],
],
];
Cross-Field Validation
The request includes custom validation in withValidator():
Transition Validation
- Verifies transition exists
- Extracts
flow_idfrom transition and stores in context - Ensures transition belongs to a valid flow
// Automatically validates:
// - Transition exists
// - Flow exists
// - Stores flow_id in context
Error Handling
Validation Errors
{
"message": "The given data was invalid.",
"errors": {
"flow_transition_id": [
"The selected flow transition id is invalid."
],
"driver": [
"The driver class does not exist."
],
"config.recipient": [
"The config.recipient field is required."
]
}
}
Driver-Specific Errors
{
"errors": {
"driver": [
"The driver is not registered in FlowTaskRegistry."
],
"config.email": [
"The config.email must be a valid email address."
]
}
}
Best Practices
-
Register Drivers First: Ensure drivers are registered before creating tasks
// ✅ Good - Register in service provider
FlowTaskRegistry::register(SendEmailTask::class); -
Use Fully Qualified Class Names: Always use complete namespace
// ✅ Good
'driver' => 'App\FlowTasks\SendEmailTask'
// ❌ Bad
'driver' => 'SendEmailTask' -
Validate Config Structure: Match config to driver's form definition
// ✅ Good - Matches form
'config' => [
'recipient' => 'user@example.com',
'subject' => 'Test',
] -
Set Appropriate Ordering: Use ordering to control execution sequence
// ✅ Good
'ordering' => 1, // First task
'ordering' => 2, // Second task
Related Documentation
- FlowTask Service - Task management
- UpdateFlowTaskRequest - Task update validation
- FlowTaskResource - Task JSON resource
- FlowTaskRegistry - Driver registration
- MakeTask Command - Creating task drivers
- Events - Task lifecycle events