php-standard-library/foundation
A lightweight PHP foundation library offering common building blocks and utilities to bootstrap projects. Provides reusable helpers and core abstractions to reduce boilerplate and standardize patterns across apps and packages.
Ref), and invariant functions aligns with Laravel’s need for consistent error handling and immutable data patterns. It can serve as a shared layer for:
ValueObject, Result, and Either types across services.invariant(fn() => $user->isActive())) in HTTP responses.Ref wrappers for event payloads to prevent accidental mutations.Illuminate\Support\MessageBag), this package offers alternative abstractions (e.g., Foundation\Result) that may better fit functional programming or DDD patterns.ProblemDetails for HTTP APIs).Illuminate\Support\Exceptions\Handler may conflict with the package’s Exception hierarchy. Solution: Use the package for domain-specific exceptions (e.g., Domain\ValidationException) while keeping Laravel’s for HTTP errors.Ref and invariant() can bridge this gap (e.g., wrapping Illuminate\Support\Collection).PHPUnit assertions for Result types). May require custom matchers or traits.Str::, Arr::, or collect() over external packages. Mitigation: Frame this as a DDD/functional programming toolkit, not a replacement.invariant() or Ref may be unfamiliar. Solution: Provide internal documentation and workshops.composer.json. Solution: Audit for transitive dependencies (e.g., Symfony components).Ref) or validation (invariant()) may introduce runtime overhead. Solution: Benchmark and optimize hot paths.Exception hierarchy extend Laravel’s Throwable without conflicts?Ref integrate with Laravel’s mutable collections (e.g., Illuminate\Support\Collection)?invariant() replace Laravel’s validation (e.g., Validator) or work alongside it?Pest assertions) for Result types?Result and Either for pure functions (e.g., Result::ok($user) vs. throw new ValidationException).ProblemDetails (if the package supports it).invariant() for preconditions in unit tests (e.g., invariant(fn() => $user->exists)).Domain\ValidationException) in a non-critical module.Ref wrappers for immutable event payloads.composer.json and configure autoloading.Handler and the package’s Exception.Result types (e.g., Result::bind() for monadic chaining).Ref and invariant().invariant() failures).Foundation\Exception to implement Illuminate\Contracts\Container\Bindable.Ref::fromCollection($laravelCollection)).invariant() alongside Laravel’s Validator for preconditions (e.g., invariant(fn() => $request->has('required_field'))).| Phase | Focus Area | Tools/Steps |
|---|---|---|
| Discovery | Audit exceptions/data patterns | Static analysis, codebase search |
| Pilot | Replace 1 exception type | Module refactor, test coverage |
| Validation | Test invariant() in preconditions |
Add to CI, monitor failures |
| Core Integration | Refactor domain logic to Result |
Monadic chaining, error boundaries |
| API Layer | Standardize HTTP error responses | ProblemDetails integration |
| Full Adoption | Deprecate old patterns | Deprecation warnings, documentation |
Ref and invariant() reduce bugs from accidental mutations.^6.2) to avoid surprises.App\Exceptions\DomainException extends Foundation\Exception).invariant() or Ref may require training.Result with Eloquent").collect() instead of Ref).Ref) can enable optimizations (e.g., memoization).Ref/invariant may add overhead.Ref::lazy() for expensive immutable wrappers.How can I help you explore Laravel packages today?