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.
composer require php-standard-library/foundation
use Foundation\Helpers\StringHelper;
use Foundation\Collections\Collection;
use Foundation\Contracts\Arrayable;
$cleaned = StringHelper::slugify('My Awesome Post');
// Output: "my-awesome-post"
Foundation\Helpers namespace (e.g., StringHelper, ArrayHelper)Foundation\Collections\Collection (Laravel-like but framework-agnostic)Foundation\Contracts (e.g., Arrayable, Jsonable) for type safetyFoundation\Conventions for project-wide standards (e.g., naming, file structures)Centralized Utilities: Replace duplicated logic (e.g., array flattening, deep merging) with package methods:
use Foundation\Helpers\ArrayHelper;
$merged = ArrayHelper::deepMerge($array1, $array2);
Framework-Agnostic Abstractions:
Use Arrayable/Jsonable contracts in Laravel models/services:
use Foundation\Contracts\Arrayable;
class User implements Arrayable {
public function toArray(): array {
return ['id' => $this->id, 'name' => $this->name];
}
}
Composable Building Blocks:
Extend Foundation\Collections\Collection for custom logic:
$collection = new Collection([1, 2, 3]);
$filtered = $collection->filter(fn($item) => $item > 1);
Laravel Integration:
$this->app->bind(Arrayable::class, function () {
return new LaravelArrayableAdapter();
});
Str::, Arr:: with Foundation\Helpers where conventions align.Testing:
Use Foundation\Testing\TestCase as a base for PHPUnit tests to enforce consistent assertions.
autoload-dev includes test helpers if using Foundation\Testing.config/foundation.php (if provided) or environment variables.@mixin in PHPDoc for IDE autocompletion:
/** @mixin \Foundation\Collections\Collection */
class LaravelCollection extends \Illuminate\Support\Collection {}
app/Helpers with Foundation\Helpers).Framework Assumptions:
Request objects) with framework-agnostic helpers. Use adapters if needed.Illuminate\Http\Request to StringHelper::slugify()—extract the string first.Performance Overhead:
ArrayHelper::deepMerge() uses recursion; prefer iterative methods for large arrays.Contract Conflicts:
Arrayable/Jsonable. Use fully qualified namespaces to avoid collisions:
use Foundation\Contracts\Arrayable as FoundationArrayable;
Configuration Quirks:
bootstrap/app.php:
$app->singleton(\Foundation\Helpers\StringHelper::class, function () {
return new StringHelper(config('foundation.string.default_locale', 'en'));
});
FOUNDATION_DEBUG=true in .env to log helper invocations (if supported).phpstan or psalm to catch type mismatches with Foundation\Contracts.Collection methods match Laravel’s (e.g., pluck() vs. map()). Check the Collections API docs.Custom Helpers:
Extend base classes (e.g., StringHelper) via traits or decorators:
use Foundation\Helpers\StringHelper;
trait CustomStringHelper {
public function customMethod(string $input): string {
return $this->slugify($input) . '-suffix';
}
}
New Contracts:
Add interfaces to Foundation\Contracts for project-specific needs:
namespace Foundation\Contracts;
interface Cacheable {
public function toCacheArray(): array;
}
Testing Extensions:
Override Foundation\Testing\TestCase to add Laravel-specific assertions:
class LaravelTestCase extends TestCase {
protected function assertModelExists($modelClass, $attributes) {
$this->assertDatabaseHas($modelClass::class, $attributes);
}
}
Package Composition:
Use Foundation as a dependency for your own packages to enforce shared conventions:
{
"require": {
"php-standard-library/foundation": "^1.0"
},
"extra": {
"laravel": {
"providers": ["Foundation\Providers\FoundationServiceProvider"]
}
}
}
Foundation to avoid conflicts (e.g., FoundationStringHelper).phpDocumentor to share conventions across teams.composer validate check to enforce package constraints in PRs.Foundation\Legacy\Compatibility to wrap old utilities for gradual migration.How can I help you explore Laravel packages today?