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.twig
<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:

CreateUserRequest.php
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:

UserController.php
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

CreateUserRequest.php
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

UserController.php
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.twig
<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

form.js
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.

Find the documentation helpful?

Show your support by starring our project on GitHub

Star on GitHub