Skip to content

Laravel Extensions

Laravel extension packages enhance core framework features with RightCapital-specific functionality.

Extended Eloquent ORM with submodels, IAM authentication, and enhanced validation.

  • Submodel casting for nested JSON objects
  • AWS RDS IAM authentication connectors
  • Custom query builder macros
  • Model-level validation on save
  • ArtisanServiceProvider - Custom SeedCommand for YAML seeders
  • MySqlServiceProvider - MySQL/IAM auth configuration
  • QueryBuilderServiceProvider - Query builder macros
  • EloquentCollectionServiceProvider - Collection macros
  • ModelServiceProvider - Timezone configuration
use RightCapital\Illuminate\Database\Submodel;
class HouseholdSettings extends Submodel {
public bool $notifications_enabled = true;
public string $timezone = 'America/New_York';
public function rules(): array {
return [
'timezone' => 'required|timezone',
];
}
}
class Household extends Model {
protected $casts = [
'settings' => HouseholdSettings::class,
];
}
// Usage
$household->settings->notifications_enabled = false;
$household->save(); // Validates and serializes to JSON
// Connectors for AWS RDS IAM auth
use RightCapital\Illuminate\Database\Connectors\IamAuthMySqlConnector;
use RightCapital\Illuminate\Database\Connectors\IamAuthPostgresConnector;
// Automatically generates temporary tokens
$token = RdsIamAuthTokenGenerator::generate($host, $port, $user, $region);
  • ValidatesWhenSavingTrait - Auto-validates on save
  • RemovesGlobalScopes - Remove global scopes from queries
  • HasRelationships - Enhanced relationship handling

Advanced encryption with ID encryption, static IV, and Base64URL encoding.

  • Optimized ID encryption (22-byte output)
  • Static IV support for deterministic encryption
  • Raw binary output mode
  • Base64URL encoding

EncryptionServiceProvider replaces Laravel’s default encrypter.

use RightCapital\Illuminate\Encryption\Crypt;
// Standard encryption
$encrypted = Crypt::encrypt($data);
$decrypted = Crypt::decrypt($encrypted);
// ID encryption (optimized for numeric IDs)
$encryptedId = Crypt::encryptId(12345); // 22-byte output
$id = Crypt::decryptId($encryptedId); // 12345
// Raw output (no Base64)
$raw = Crypt::encryptString($data, static_iv: true, raw_output: true);
config/app.php
'cipher' => 'aes-256-cbc',
'key' => env('APP_KEY'),
'id_encryption_iv' => env('APP_ID_ENCRYPTION_IV'),

Flysystem decorator chains for compression, encryption, and other adapters.

  • Decorator pattern for stacked adapters
  • S3 Guzzle configuration for compression support
  • Container-aware decorator instantiation
config/filesystems.php
'disks' => [
's3' => [
'driver' => 's3',
// ... standard S3 config
'flysystem_decorators' => [
'CompressAdapter' => [
'rules' => [/* compression rules */],
],
],
],
],

Decorators are applied automatically based on configuration. The FilesystemManager processes the flysystem_decorators array and wraps the base adapter.


RFC 7807 Problem Details for HTTP APIs.

  • Standardized error response format
  • Sensitive field masking
  • Content-Type: application/problem+json
// Using response macro
return response()->problem(
detail: 'Missing required field: email',
status: 400,
extra: ['field' => 'email'],
type: 'https://api.rightcapital.io/probs/validation-error',
title: 'Validation Error'
);
// Response structure
{
"type": "https://api.rightcapital.io/probs/validation-error",
"title": "Validation Error",
"status": 400,
"detail": "Missing required field: email",
"field": "email"
}
  • Masks sensitive keys (authorization, password, token, secret, etc.)
  • UTF-8 encoding conversion
  • Recursive array traversal for nested values

Extended resource routing that disables PATCH method.

  • Removes PATCH route from resource registrations
  • Only registers PUT for update operations
// Route::resource('users', UserController::class);
// Generates: GET, POST, PUT, DELETE (no PATCH)

This is automatically applied via the ResourceRegistrarServiceProvider.


Extended validation with null conditions, HTML validation, and precision checks.

Rule Description
null Value must be null
null_if Null if condition matches
null_unless Null unless condition matches
null_with Null when certain fields present
null_without Null when fields absent
true / false Boolean true/false
binary Binary string value
html Valid HTML with allowed tags
array_sum Array of numbers summing to value
max_precision Decimal places limit
real_email Non-disposable email
$validator = Validator::make($data, [
'nullable_field' => 'null_if:other_field,yes',
'content' => 'html:p,br,strong,em',
'percentages' => 'array_sum:100',
'amount' => 'max_precision:2',
'email' => 'real_email',
]);
// Custom size calculation for binary strings
// Enhanced nullable check with null-conditional rules

RESTful controller traits for building resource APIs.

Trait Methods
ModelBased Base trait for model-backed controllers
Listable index() with pagination
Readable show() for single resource
Creatable store() for creation
Updatable update() for modifications
Deletable destroy() for deletion
BulkOperateable Bulk create/update/delete
Restorable Soft delete restoration
class UserController extends Controller {
use ModelBased, Listable, Readable, Creatable, Updatable, Deletable;
protected const MODEL = User::class;
protected const EAGER_LOAD_RELATIVES = [
'profile' => [],
'roles' => ['permissions'],
];
}
use RightCapital\LaravelRestful\JsonResource;
class UserResource extends JsonResource {
#[Attribute('id')]
#[Attribute('email')]
#[ConditionalAttribute('phone', when: 'hasPhone')]
#[Relation('profile')]
public function toArray($request): array {
return $this->resolveAttributes();
}
}

The Listable trait supports:

  • Chunk mode (offset pagination)
  • Stream mode (cursor pagination)
  • RFC Link headers for navigation

Multi-source form request validation (JSON, form, query).

Class Source Use Case
JsonRequest JSON body API requests
FormDataRequest Form data File uploads
EmptyBodyRequest Query params GET/DELETE
class CreateUserRequest extends JsonRequest {
public function rules(): array {
return [
self::SOURCE_JSON => [
'email' => 'required|email',
'name' => 'required|string',
],
self::SOURCE_QUERY => [
'include' => 'array',
],
];
}
}
class UserController {
// Form request rules can come from controller
public function getJsonRequestRules(): array {
return [
'POST' => ['email' => 'required'],
'PUT' => ['email' => 'sometimes'],
];
}
}

Package Extends Key Features
illuminate-database Eloquent Submodels, IAM auth, validation
illuminate-encryption Encryption ID encryption, static IV
illuminate-filesystem Flysystem Decorator chains
illuminate-http-problem-response HTTP RFC 7807 errors
illuminate-routing Routing No PATCH method
illuminate-validation Validation 12+ custom rules
laravel-restful Controllers RESTful traits
laravel-form-requests Form Requests Multi-source validation