Essentials

Requests & Responses

Read request data and return consistent JSON responses

Glueful controllers work with Symfony Request objects and Glueful Response helpers.

Reading Request Data

In controllers that extend BaseController, use the helper methods that already exist:

use Symfony\Component\HttpFoundation\Request;

public function store(Request $request)
{
    $data = $this->getRequestData();

    $email = $request->request->get('email');
    $page = (int) $request->query->get('page', 1);
    $token = $request->headers->get('Authorization');
}

JSON Requests

BaseController::getRequestData() detects JSON requests and returns a parsed array:

public function store(Request $request)
{
    $data = $this->getRequestData();

    return $this->success([
        'received' => $data,
    ]);
}

Files

public function upload(Request $request)
{
    $file = $request->files->get('avatar');

    if ($file === null) {
        return Response::validation([
            'avatar' => ['Avatar is required.'],
        ]);
    }

    return Response::success([
        'filename' => $file->getClientOriginalName(),
    ]);
}

Response Helpers

Glueful’s Response class standardizes JSON output.

Success

use Glueful\Http\Response;

return Response::success($data);
return Response::success($data, 'Users retrieved');
return Response::created($user);
return Response::noContent();

Errors

return Response::notFound('User not found');
return Response::unauthorized('Invalid token');
return Response::forbidden('Access denied');
return Response::validation([
    'email' => ['Email is required.'],
]);
return Response::error('Something went wrong', 500);

Pagination

public function index(Request $request): Response
{
    $page = (int) $request->query->get('page', 1);
    $perPage = 20;

    $users = $this->db->table('users')
        ->limit($perPage)
        ->offset(($page - 1) * $perPage)
        ->get();

    $total = $this->db->table('users')->count();

    return Response::paginated($users, $total, $page, $perPage);
}

For most controllers in the API skeleton:

public function store(Request $request): Response
{
    $data = $this->getRequestData();

    if ($error = $this->validateRequest($data, [
        'title' => 'required|max:255',
    ])) {
        return $error;
    }

    return $this->created([
        'title' => $data['title'],
    ]);
}