2.8 KiB
2.8 KiB
BaseApiController plan
Scope
- Controller:
app/Http/Controllers/Api/Core/BaseApiController.php - Purpose: shared API conveniences:
- Standard success/error JSON envelope helpers
- Request payload normalization (JSON body vs query/form)
- Validation helper compatible with legacy CodeIgniter-like rules
- Lightweight pagination helper for arrays/query builders
- Current-user resolution helpers (id + role list)
Key responsibilities
Response helpers
success($data, $message, $code)→{ status:true, message, data }error($message, $code, $errors?)→{ status:false, message, errors? }- Convenience wrappers:
respondSuccess,respondCreated,respondDeleted,respondError,respondValidationError
Request normalization
- Stores the underlying Laravel request as
laravelRequest. - Wraps it in
CiRequestAdapteras$this->requestfor compatibility patterns. payloadData():- Uses JSON-decoded body when present and valid
- Falls back to merged query + form data
Validation
validateRequest($data, $rules):- Normalizes CodeIgniter-like rule strings into Laravel rules via
normalizeRules(). - Saves validator to
$this->validator. - Returns
[]on success, orerrors()->toArray()on failure.
- Normalizes CodeIgniter-like rule strings into Laravel rules via
validate($rules)validates againstpayloadData()and returns boolean.
Pagination
paginate($source, $page, $perPage)supports:- Eloquent builder / query builder
- Plain arrays
- Returns
{ data: [...], pagination:{ current_page, per_page, total, total_pages } }
Current user helpers
getCurrentUserId()resolves authenticated id from multiple sources.getCurrentUser():- Loads
Userrow - Computes display name
- Loads roles via
user_roles/rolesjoin (best-effort; logs error and returnsroles: []if it fails)
- Loads
Usage guidance (project conventions)
- Controllers extending
BaseApiControllershould prefer:respondSuccess/respondErrorfor consistent envelopes where possible.- Returning explicit
{ ok: true }shapes only when required for legacy client compatibility.
- Validation:
- Prefer dedicated
FormRequestclasses for new endpoints. - Use
validateRequest/normalizeRulesonly for legacy/bridge use cases.
- Prefer dedicated
Test plan (unit)
normalizeRules()conversions:max_length[n]→max:n,min_length[n]→min:n,valid_email→email,permit_empty→nullable,is_unique[t.c]→unique:t,c, etc.
payloadData():- JSON body takes precedence when valid
- Falls back to query+form when no JSON
paginate():- Eloquent builder: returns expected total + slices
- Array source: returns expected slice
getCurrentUser():- No auth →
null - Role query failure → returns user with empty roles and logs error
- No auth →