Forms & Validation
Yabasi framework provides a powerful and flexible system for handling forms and validating data. This system allows you to process and validate user inputs securely and efficiently.
Creating Forms
In Yabasi, forms are typically created within Twig templates. Here's an example of a simple form:
<form method="POST" action="{{ url('user.store') }}">
{{ csrf_field()|raw }}
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="name" value="{{ old('name') }}">
</div>
<button type="submit">Submit</button>
</form>
Handling Form Submissions
Yabasi Framework provides a robust form handling mechanism through dedicated FormRequest classes. This approach separates validation logic from controllers and provides a clean, maintainable way to handle form submissions.
1. Create a Form Request
First, create a FormRequest class that defines validation rules and custom messages:
namespace Yabasi\Http\Requests;
class CreateUserRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8'
];
}
public function messages(): array
{
return [
'email.unique' => 'This email is already registered.'
];
}
}
2. Handle the Form Submission
In your controller, use the FormRequest to validate and handle the submission:
public function store(Request $request): Response
{
$formRequest = new CreateUserRequest($request, $this->validator);
if (!$formRequest->validate()) {
return $this->json([
'success' => false,
'errors' => $formRequest->errors()
], 422);
}
$user = new User();
$user->fill([
'name' => $formRequest->get('name'),
'email' => $formRequest->get('email'),
'password' => password_hash($formRequest->get('password'), PASSWORD_DEFAULT),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
]);
$user->save();
return $this->json([
'success' => true,
'message' => 'User created successfully'
], 201);
}
Available Validation Rules
Yabasi Framework provides a comprehensive set of validation rules:
required
Field must be present
string
Must be a string
email
Must be valid email
min:value
Minimum length/value
max:value
Maximum length/value
unique:table
Must be unique in table
Handling Validation Errors
When validation fails, you can access the errors through the errors()
method. The response will include detailed error messages for each failed validation rule.
Example Response:
{
"success": false,
"errors": {
"email": ["This email is already registered."],
"password": ["The password must be at least 8 characters."]
}
}
Remember to define the $fillable
array in your model to specify which attributes can be mass assigned.
Validation
Yabasi Framework provides a comprehensive validation system through dedicated FormRequest classes and the Validator component.
Creating a Validator
There are two ways to implement validation in Yabasi Framework:
1. Using FormRequest
namespace Yabasi\Http\Requests;
class CreateUserRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users'
];
}
public function messages(): array
{
return [
'email.unique' => 'This email address is already taken.'
];
}
}
2. Using the Validator Directly
public function store(Request $request): Response
{
$rules = [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users'
];
if (!$this->validator->make($request->all(), $rules)) {
return $this->json([
'success' => false,
'errors' => $this->validator->errors()
], 422);
}
// Process validated data
}
Handling Validation Errors
When validation fails, you can access the errors in your frontend. Here's how to handle validation errors in different contexts:
1. API Response
JSON Response Format:
{
"success": false,
"errors": {
"email": ["This email address is already taken."],
"name": ["The name field is required."]
}
}
2. Twig Templates
<form method="POST" action="/users" id="createUserForm">
<div class="form-group">
<input type="email" name="email" value="{{ old('email') }}">
<div class="error-message" data-field="email"></div>
</div>
{{ csrf_field()|raw }}
<button type="submit">Submit</button>
</form>
3. JavaScript Error Handling
document.getElementById('createUserForm').addEventListener('submit', async (e) => {
e.preventDefault();
const form = e.target;
const formData = new FormData(form);
try {
const response = await fetch('/users', {
method: 'POST',
body: formData
});
const data = await response.json();
if (!data.success) {
Object.entries(data.errors).forEach(([field, messages]) => {
const errorDiv = form.querySelector(`[data-field="${field}"]`);
errorDiv.textContent = messages[0];
});
}
} catch (error) {
console.error('Error:', error);
}
});
Remember to include CSRF protection in your forms using the csrf_field()
function.