Controllers organize your request handling logic into discrete classes.
Generating a Controller
Terminal • bash
php veldora make:controller PostControllerWriting 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'));