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.

RuleDescription
nullValue must be null
null_ifNull if condition matches
null_unlessNull unless condition matches
null_withNull when certain fields present
null_withoutNull when fields absent
true / falseBoolean true/false
binaryBinary string value
htmlValid HTML with allowed tags
array_sumArray of numbers summing to value
max_precisionDecimal places limit
real_emailNon-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.

TraitMethods
ModelBasedBase trait for model-backed controllers
Listableindex() with pagination
Readableshow() for single resource
Creatablestore() for creation
Updatableupdate() for modifications
Deletabledestroy() for deletion
BulkOperateableBulk create/update/delete
RestorableSoft 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).

ClassSourceUse Case
JsonRequestJSON bodyAPI requests
FormDataRequestForm dataFile uploads
EmptyBodyRequestQuery paramsGET/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'],
];
}
}

PackageExtendsKey Features
illuminate-databaseEloquentSubmodels, IAM auth, validation
illuminate-encryptionEncryptionID encryption, static IV
illuminate-filesystemFlysystemDecorator chains
illuminate-http-problem-responseHTTPRFC 7807 errors
illuminate-routingRoutingNo PATCH method
illuminate-validationValidation12+ custom rules
laravel-restfulControllersRESTful traits
laravel-form-requestsForm RequestsMulti-source validation