A comprehensive collection of support utilities for PHP applications, providing helpers for strings, files, hashing, JSON, environment management, HTTP requests, and logging.
- PHP 8.4 or higher
- Extensions:
ctype,fileinfo,mbstring,simplexml
Install via Composer:
composer require elliephp/supportPowerful string manipulation methods:
use ElliePHP\Components\Support\Util\Str;
// Case conversion
Str::toCamelCase('hello-world'); // helloWorld
Str::toSnakeCase('HelloWorld'); // hello_world
Str::toKebabCase('HelloWorld'); // hello-world
Str::slug('Hello World!'); // hello-world
// String operations
Str::startsWith('hello', 'he'); // true
Str::contains('hello world', 'world'); // true
Str::limit('Long text...', 10); // Long text...
Str::random(16); // Random string
// Validation
Str::isEmail('test@example.com'); // true
Str::isUrl('https://example.com'); // true
Str::isJson('{"key":"value"}'); // trueComprehensive hashing and ID generation:
use ElliePHP\Components\Support\Util\Hash;
// Password hashing
$hash = Hash::create('password');
Hash::check('password', $hash); // true
// Various hash algorithms
Hash::sha256('data');
Hash::xxh3('data');
Hash::md5('data');
// ID generation
Hash::uuid(); // UUID v4
Hash::ulid(); // ULID
Hash::nanoid(); // NanoID
// File hashing
Hash::file('/path/to/file');Complete file system utilities:
use ElliePHP\Components\Support\Util\File;
// Read/Write
$content = File::get('/path/to/file.txt');
File::put('/path/to/file.txt', 'content');
File::append('/path/to/file.txt', 'more');
// File info
File::size('/path/to/file');
File::mimeType('/path/to/file');
File::extension('/path/to/file.txt'); // txt
// JSON operations
$data = File::json('/path/to/data.json');
File::putJson('/path/to/data.json', ['key' => 'value']);
// Directory operations
File::makeDirectory('/path/to/dir');
File::files('/path/to/dir');
File::deleteDirectory('/path/to/dir');Advanced JSON handling:
use ElliePHP\Components\Support\Util\Json;
// Encode/Decode with error handling
$json = Json::encode(['key' => 'value']);
$data = Json::decode($json);
// Pretty printing
Json::pretty(['key' => 'value']);
// Dot notation access
Json::get($json, 'user.address.city', 'default');
Json::set($json, 'user.name', 'John');
// File operations
Json::fromFile('/path/to/file.json');
Json::toFile('/path/to/file.json', $data);
// Utilities
Json::flatten($json);
Json::merge($json1, $json2);
Json::validate($json, $schema);Easy .env file handling with automatic type casting:
use ElliePHP\Components\Support\Util\Env;
// Create instance and load .env file
$env = new Env(__DIR__);
$env->load();
// Automatic type casting based on default value type
$debug = $env->get('APP_DEBUG', false); // Casts to bool
$port = $env->get('APP_PORT', 3000); // Casts to int
$timeout = $env->get('TIMEOUT', 30.5); // Casts to float
$name = $env->get('APP_NAME', 'MyApp'); // Casts to string
$features = $env->get('FEATURES', []); // Casts to array (comma-separated)
// Smart casting when no default provided
// Automatically detects: booleans, integers, floats, and strings
$value = $env->get('SMART_VALUE'); // Auto-detects type
// 'true' / 'false' / 'yes' / 'no' / 'on' / 'off' → bool
// '123' → int
// '123.45' → float
// 'text' → string
// Special .env values
// APP_DEBUG=true → boolean true
// APP_DEBUG=(true) → boolean true
// APP_PORT=3000 → integer 3000
// APP_TIMEOUT=30.5 → float 30.5
// APP_VALUE=null → null
// APP_VALUE=(null) → null
// APP_EMPTY=empty → empty string
// APP_EMPTY=(empty) → empty string
// Check if variable exists
$env->has('APP_KEY'); // true/false
// Get all environment variables
$all = $env->all();
// Require variables
$env->require(['APP_KEY', 'DB_HOST']);
$env->requireNotEmpty(['APP_KEY', 'DB_HOST']);
$env->requireOneOf('APP_ENV', ['local', 'staging', 'production']);
// Load with required variables in one call
$env->loadWithRequired(['APP_KEY', 'DB_HOST', 'DB_NAME']);
// Check if .env was loaded
if ($env->isLoaded()) {
// Environment loaded
}PSR-7 compliant request wrapper:
use ElliePHP\Components\Support\Http\Request;
$request = Request::fromGlobals();
// Input handling
$name = $request->input('name', 'default');
$email = $request->string('email');
$age = $request->int('age', 0);
$active = $request->bool('active');
// Request info
$request->method(); // GET, POST, etc.
$request->path(); // /api/users
$request->isJson(); // true/false
$request->bearerToken(); // JWT token
// Headers
$request->header('Content-Type');
$request->hasHeader('Authorization');PSR-7 compliant response builder with extensive helpers:
use ElliePHP\Components\Support\Http\Response;
use Nyholm\Psr7\Factory\Psr17Factory;
$factory = new Psr17Factory();
$psrResponse = $factory->createResponse(200);
$response = new Response($psrResponse);
// Basic responses
$response->make('Hello World');
$response->make(['data' => 'value'], 200, ['X-Custom' => 'header']);
// Content type responses
$response->json(['status' => 'success']);
$response->jsonp('callback', ['data' => 'value']);
$response->html('<h1>Hello</h1>');
$response->text('Plain text content');
$response->xml('<?xml version="1.0"?><root></root>');
// Redirects
$response->redirect('/dashboard');
$response->redirectPermanent('/new-url'); // 301
$response->redirectTemporary('/temp-url'); // 302
$response->redirectSeeOther('/other'); // 303
$response->back('/fallback'); // Previous URL
// Status code helpers (2xx)
$response->ok(['data' => 'value']); // 200
$response->created(['id' => 123]); // 201
$response->accepted(['queued' => true]); // 202
$response->noContent(); // 204
// Status code helpers (4xx)
$response->badRequest('Invalid input'); // 400
$response->unauthorized('Login required'); // 401
$response->forbidden('Access denied'); // 403
$response->notFound('Resource not found'); // 404
$response->methodNotAllowed(['GET', 'POST']); // 405
$response->conflict('Resource exists'); // 409
$response->unprocessable(['errors' => []]); // 422
$response->tooManyRequests(60, 'Rate limit'); // 429
// Status code helpers (5xx)
$response->serverError('System error'); // 500
$response->serviceUnavailable(300, 'Down'); // 503
// File downloads
$response->download($content, 'report.pdf');
$response->file('/path/to/document.pdf', 'custom-name.pdf');
$response->streamDownload('/path/to/large-file.zip', 'archive.zip');
$response->streamDownload('/tmp/file.txt', null, [], true); // Delete after
// Headers and cookies
$response->withHeader('X-Custom', 'value');
$response->withHeaders(['X-Foo' => 'bar', 'X-Baz' => 'qux']);
$response->contentType('application/json');
$response->cacheControl('max-age=3600');
$response->noCache();
$response->etag('abc123');
$response->lastModified(time());
// Cookies
$response->cookie('session', 'abc123', 60); // Expires in 60 minutes
$response->withCookie('token', 'xyz', time() + 3600);
$response->withoutCookie('old_cookie'); // Delete cookie
// Response inspection
$response->status(); // Get status code
$response->isSuccessful(); // 2xx
$response->isOk(); // 200
$response->isRedirect(); // 3xx
$response->isClientError(); // 4xx
$response->isServerError(); // 5xx
$response->isForbidden(); // 403
$response->isNotFound(); // 404
// Body and headers
$response->body(); // Get body as string
$response->content(); // Alias for body()
$response->toJson(); // Encode body as JSON
$response->headers(); // Get all headers
$response->getHeader('Content-Type'); // Get specific header
$response->hasHeader('Authorization'); // Check header exists
// PSR-7 access
$psrResponse = $response->psr(); // Get PSR-7 response
$psrResponse = $response->raw(); // Alias for psr()
// Send response
$response->send(); // Send to client
$response->sendAndExit(); // Send and exit script
// Building responses - Two approaches:
// 1. Include headers directly in response creation (recommended)
$psrResponse = $response->json(
['user' => 'John'],
200,
['X-API-Version' => '1.0', 'X-Request-ID' => 'abc123']
);
$psrResponse = $response->ok(
['success' => true],
['X-Total-Count' => '150', 'Cache-Control' => 'public, max-age=3600']
);
$psrResponse = $response->redirect(
'/dashboard',
302,
['X-Redirect-Reason' => 'authentication']
);
// 2. Use PSR-7 method chaining for complex modifications
// Response creation methods return PSR-7 ResponseInterface which supports chaining
$psrResponse = $response->json(['data' => 'value'])
->withStatus(201)
->withHeader('X-Custom', 'header')
->withHeader('X-Rate-Limit', '100')
->withAddedHeader('Set-Cookie', 'session=abc123; Path=/');
// Chain multiple PSR-7 methods
$psrResponse = $response->html('<h1>Hello</h1>')
->withHeader('Content-Security-Policy', "default-src 'self'")
->withHeader('X-Frame-Options', 'DENY')
->withHeader('X-Content-Type-Options', 'nosniff');
// Wrap PSR-7 response to use Response helper methods
$wrappedResponse = new Response($psrResponse);
$wrappedResponse->send();
// Or send PSR-7 response directly
(new Response($psrResponse))->send();PSR-3 compliant logging facade:
use ElliePHP\Components\Support\Logging\Log;
use Psr\Log\LoggerInterface;
// Inject your PSR-3 logger
$logger = new Log($psrLogger);
// Log messages
$logger->debug('Debug information');
$logger->info('User logged in', ['user_id' => 123]);
$logger->warning('Deprecated method used');
$logger->error('Database error', ['query' => $sql]);
$logger->critical('System failure');
// Log exceptions with full context
try {
// code...
} catch (\Exception $e) {
$logger->exception($e);
}Run the test suite:
composer testRun tests with coverage:
composer test:coverageContributions are welcome! Please feel free to submit a Pull Request.
This package is open-sourced software licensed under the MIT license.