Controllers are the heart of your application. They handle HTTP requests, process data, and return responses. Controllers keep your routes clean and organize your application logic.
The fastest way to create a controller is using the CLI tool:
php mini make:controller UserController
This creates a new controller file at:
app/Controllers/UserController.php
You can also create controllers manually. All controllers must:
Core\Controller classApp\Controllers namespaceapp/Controllers/ directory<?php
namespace App\Controllers;
use Core\Controller;
use Core\Request;
class UserController extends Controller
{
public function index(Request $request)
{
// Handle GET /users
return $this->view('users.index');
}
}
Controller methods receive the Request object as the first parameter,
followed by any route parameters.
public function index(Request $request)
{
// Handle the request
return $this->view('users.index');
}
// Route: Route::get('/user/{id}', 'UserController@show');
public function show(Request $request, $id)
{
// $id contains the route parameter
$user = User::find($id);
return $this->view('users.show', ['user' => $user]);
}
// Route: Route::get('/user/{userId}/post/{postId}', 'PostController@show');
public function show(Request $request, $userId, $postId)
{
// Parameters are passed in order
$user = User::find($userId);
$post = Post::find($postId);
return $this->view('posts.show', [
'user' => $user,
'post' => $post
]);
}
Controllers can return different types of responses using helper methods from the base Controller class.
public function index(Request $request)
{
// Return a view with data
return $this->view('users.index', [
'users' => User::all(),
'title' => 'All Users'
]);
}
public function api(Request $request)
{
// Return JSON response
return $this->json([
'status' => 'success',
'data' => User::all()
], 200);
}
public function simple(Request $request)
{
// Return plain text
return $this->text('Hello, World!', 200);
}
public function store(Request $request)
{
// Process form data
$data = $request->post();
User::create($data);
// Redirect after successful creation
return $this->redirect('/users');
}
<?php
namespace App\Controllers;
use Core\Controller;
use Core\Request;
use App\Models\User;
class UserController extends Controller
{
/**
* Display a listing of users
*/
public function index(Request $request)
{
$users = User::all();
return $this->view('users.index', [
'users' => $users,
'title' => 'All Users'
]);
}
/**
* Show a specific user
*/
public function show(Request $request, $id)
{
$user = User::find($id);
if (!$user) {
return $this->text('User not found', 404);
}
return $this->view('users.show', [
'user' => $user
]);
}
/**
* Show form to create a new user
*/
public function create(Request $request)
{
return $this->view('users.create');
}
/**
* Store a new user
*/
public function store(Request $request)
{
$data = $request->post();
// Validate data (add your validation logic)
if (empty($data['name']) || empty($data['email'])) {
return $this->redirect('/users/create');
}
// Create user
$user = new User();
$user->create($data);
// Redirect to user list
return $this->redirect('/users');
}
/**
* Update a user
*/
public function update(Request $request, $id)
{
$data = $request->post();
$user = new User();
$user->update($id, $data);
return $this->redirect('/users/' . $id);
}
/**
* Delete a user
*/
public function delete(Request $request, $id)
{
$user = new User();
$user->delete($id);
return $this->json(['message' => 'User deleted'], 200);
}
}
The Request object provides access to GET, POST, headers, and more.
public function store(Request $request)
{
// Get POST data
$name = $request->post('name');
$email = $request->post('email');
// Get all POST data
$allData = $request->post();
// Get GET parameters
$page = $request->get('page', 1); // with default value
// Get input (checks both GET and POST)
$search = $request->input('search');
// Get headers
$token = $request->header('Authorization');
// Get request method
$method = $request->method(); // GET, POST, etc.
// Get request path
$path = $request->path(); // /users/123
}
index, show, create, store, update, delete.
Now that you understand controllers, learn about: