VeldoraDocs

3. Controllers & Requests

Controllers organize your request handling logic into discrete classes.

Generating a Controller

Terminal • bash
php veldora make:controller PostController

Writing Controller Actions

app/Models/Post.php
PHP
namespace App\Controllers;

use Veldora\Framework\Http\Request;
use Veldora\Framework\Http\Response;
use App\Models\Post;

class PostController
{
    public function index(Request $request): Response
    {
        $page = (int) $request->query('page', 1);
        $posts = Post::paginate(10, $page);

        return view('posts.index', ['posts' => $posts]);
    }

    public function store(Request $request): Response
    {
        $validated = $request->validated([
            'title' => 'required|min:3|max:255',
            'body'  => 'required',
        ]);

        $post = Post::create([
            'title'   => $validated['title'],
            'body'    => $validated['body'],
            'user_id' => auth()->id(),
        ]);

        return Response::redirect('/posts/' . $post->id)
            ->with('success', 'Post published successfully!');
    }
}

HTTP Responses & Factories

Veldora provides a dedicated, expressive response system designed for modern APIs and full-stack web apps alike:

example.php
PHP
use Veldora\Framework\Http\JsonResponse;
use Veldora\Framework\Http\RedirectResponse;
use Veldora\Framework\Http\Response;

// 1. View Responses
return view('welcome', ['name' => 'World']);

// 2. Global response() Factory
return response('Custom plain text', 200);
return response()->noContent();                         // 204 No Content
return response()->download($filePath, 'invoice.pdf');   // Stream as download
return response()->file($imagePath);                    // Display inline

// 3. JSON Responses
return json(['user' => $user]);
return JsonResponse::success(['token' => $token], 'Logged in successfully');
return JsonResponse::error('Validation failed', 422, ['email' => ['Invalid email']]);
return JsonResponse::paginate($items, ['total' => 100, 'current_page' => 1]);

// 4. Redirect Responses & Session Chaining
return redirect('/dashboard');
return redirect()->to('/login', 301);
return back()->with('status', 'Profile saved!');
return back()->withErrors($validator->errors())->withInput();

Handling File Uploads

When receiving multipart form data, uploaded files are automatically wrapped in Veldora\Framework\Http\UploadedFile:

example.php
PHP
public function uploadAvatar(Request $request): Response
{
    if (!$request->hasFile('avatar')) {
        return back()->with('error', 'Please choose a file to upload.');
    }

    $file = $request->file('avatar'); // UploadedFile instance

    // Validate type and maximum file size (in KB)
    $file->validate(['image/jpeg', 'image/png', 'image/webp'], maxKb: 2048);

    // Save with a unique generated UUID to target directory
    $savedPath = $file->store('storage/app/avatars');

    // Or save with explicit custom filename
    $customPath = $file->storeAs('storage/app/avatars', 'avatar_1.png');

    return back()->with('success', 'Avatar updated!');
}

Session Management

Veldora includes a session wrapper accessible through the global session() helper or $request->session():

example.php
PHP
// Storing and retrieving values (supports dot-notation)
session()->put('user.settings.theme', 'dark');
$theme = session()->get('user.settings.theme', 'light');

// Pull (get and delete)
$flashNotice = session()->pull('notice');

// Flash messages (persisted for the next request only)
session()->flash('success', 'Order placed!');

// CSRF Protection
$token = session()->token();
$valid = session()->verifyToken($request->input('_token'));


Building with AI Assistants?
Copy the Veldora AI Developer Prompt to teach ChatGPT, Claude, Cursor, or Gemini all framework APIs for error-free coding.