HTTP Routing
Learn how to implement HTTP routing in Sockeon using attribute-based routing.
Basic HTTP Routing
Route Attributes
Sockeon uses PHP 8 attributes for clean, declarative HTTP routing:
class ApiController extends SocketController
{
#[HttpRoute('GET', '/api/health')]
public function healthCheck(Request $request): Response
{
return Response::json([
'status' => 'healthy',
'timestamp' => time()
]);
}
#[HttpRoute('POST', '/api/users')]
public function createUser(Request $request): Response
{
$data = $request->all();
// Validate required fields
if (empty($data['name']) || empty($data['email'])) {
return Response::json(['error' => 'Name and email are required'], 400);
}
// Create user logic here
$user = ['id' => 1, 'name' => $data['name'], 'email' => $data['email']];
return Response::json($user, 201);
}
#[HttpRoute('GET', '/api/users/{id}')]
public function getUser(Request $request): Response
{
$userId = $request->getParam('id');
// Get user logic here
$user = ['id' => $userId, 'name' => 'John Doe', 'email' => 'john@example.com'];
return Response::json($user);
}
#[HttpRoute('PUT', '/api/users/{id}')]
#[HttpRoute('PATCH', '/api/users/{id}')]
public function updateUser(Request $request): Response
{
$userId = $request->getParam('id');
$data = $request->all();
// Update user logic here
$user = ['id' => $userId, 'name' => $data['name'], 'email' => $data['email']];
return Response::json($user);
}
#[HttpRoute('DELETE', '/api/users/{id}')]
public function deleteUser(Request $request): Response
{
$userId = $request->getParam('id');
// Delete user logic here
return Response::json(['message' => 'User deleted'], 200);
}
}
HTTP Methods
Support for all standard HTTP methods:
class ResourceController extends SocketController
{
#[HttpRoute('GET', '/api/users')]
public function listUsers(Request $request): Response
{
$page = (int)$request->getQuery('page', 1);
$limit = (int)$request->getQuery('limit', 20);
return Response::json([
'users' => [],
'pagination' => [
'page' => $page,
'limit' => $limit,
'total' => 0
]
]);
}
#[HttpRoute('POST', '/api/users')]
public function createUser(Request $request): Response
{
$userData = $request->all();
// Validate required fields
if (empty($userData['name']) || empty($userData['email'])) {
return Response::json(['error' => 'Name and email are required'], 400);
}
return Response::json(['user' => $userData], 201);
}
#[HttpRoute('PUT', '/api/users/{id}')]
public function updateUser(Request $request): Response
{
$userId = $request->getParam('id');
$userData = $request->all();
return Response::json(['user' => array_merge(['id' => $userId], $userData)]);
}
#[HttpRoute('DELETE', '/api/users/{id}')]
public function deleteUser(Request $request): Response
{
$userId = $request->getParam('id');
return Response::json(['message' => 'User deleted']);
}
}
Route Parameters
class ParameterController extends SocketController
{
#[HttpRoute('GET', '/api/users/{id}')]
public function getUser(Request $request): Response
{
$userId = $request->getParam('id');
return Response::json(['id' => $userId]);
}
#[HttpRoute('GET', '/api/users/{id}/posts/{postId}')]
public function getUserPost(Request $request): Response
{
$userId = $request->getParam('id');
$postId = $request->getParam('postId');
return Response::json([
'user_id' => $userId,
'post_id' => $postId
]);
}
}
Query Parameters
class QueryController extends SocketController
{
#[HttpRoute('GET', '/api/search')]
public function search(Request $request): Response
{
$query = $request->getQuery('q', '');
$page = (int)$request->getQuery('page', 1);
$limit = (int)$request->getQuery('limit', 10);
return Response::json([
'query' => $query,
'page' => $page,
'limit' => $limit,
'results' => []
]);
}
}