Installation: Add the package via Composer in your Laravel project:
composer require elasticms/helpers
Ensure your project uses PHP 8.1+ and has PHPStan configured (minimum version ^1.0).
First Use Case: Replace a loose PHP function with its PHPStan-compliant wrapper. For example:
// Before (loose, triggers PHPStan errors)
$filtered = array_filter($array, fn($item) => $item > 10);
// After (typed, PHPStan-compliant)
use Elastic\Helpers\ArrayHelper;
$filtered = ArrayHelper::arrayFilter($array, fn(int $item): bool => $item > 10);
PHPStan Configuration:
Update phpstan.neon to recognize the package’s types:
includes:
- vendor/elasticms/helpers/phpstan/extension.neon
Verify Compliance: Run PHPStan to confirm errors are resolved:
vendor/bin/phpstan analyse app --level=max
Drop-in Replacements: Replace native PHP functions with typed alternatives:
// Native (loose)
$merged = array_merge($array1, $array2);
// Typed (PHPStan-compliant)
use Elastic\Helpers\ArrayHelper;
$merged = ArrayHelper::arrayMerge($array1, $array2);
Laravel Integration: Use alongside Laravel’s helpers for consistency:
use Elastic\Helpers\StrHelper;
use Illuminate\Support\Str;
// Native Laravel (loose)
$slug = Str::slug('Hello World');
// Combined (typed string helper)
$slug = StrHelper::slug('Hello World'); // Returns string|false with type hints
Custom Callbacks: Leverage typed callbacks for array/string operations:
use Elastic\Helpers\ArrayHelper;
$result = ArrayHelper::arrayMap(
$items,
fn(array $item): string => StrHelper::ucfirst($item['name'])
);
File/HTTP Helpers: Use typed wrappers for I/O operations:
use Elastic\Helpers\FileHelper;
$content = FileHelper::fileGetContents('path/to/file.txt'); // Returns string|false
New Feature Development:
json_encode with JsonHelper::encode() for typed responses.Legacy Code Refactoring:
array_filter → ArrayHelper::arrayFilter).Testing:
$this->assertIsArray(ArrayHelper::arrayFilter($data));
$this->assertIsString(JsonHelper::encode($data));
CI/CD Enforcement:
# .github/workflows/phpstan.yml
- name: PHPStan
run: vendor/bin/phpstan analyse --level=max
Alias Native Functions: Create aliases in a service provider to ease migration:
// app/Providers/AppServiceProvider.php
use Elastic\Helpers\ArrayHelper;
if (!function_exists('array_filter_typed')) {
function array_filter_typed(array $array, callable $callback): array {
return ArrayHelper::arrayFilter($array, $callback);
}
}
Custom PHPStan Rules: Extend the package’s rules for project-specific types:
# phpstan.neon
extends:
- vendor/elasticms/helpers/phpstan/extension.neon
rules:
Elastic\Helpers\ArrayHelper::arrayMerge:
- "Your custom rule for array shape validation"
Performance Considerations:
array_map vs. ArrayHelper::arrayMap).Documentation:
HELPERS.md to your repo with:
Type Mismatch Errors:
// Fails: Callback expects `int`, but `array_filter` passes `mixed`.
ArrayHelper::arrayFilter($items, fn($item) => $item > 10); // Error: Argument 2 expects `int $item`
ArrayHelper::arrayFilter($items, fn(int $item): bool => $item > 10);
Null Handling:
file_get_contents) return false on failure, but typed helpers may return null or throw exceptions.
$content = FileHelper::fileGetContents('nonexistent.txt'); // Returns null
$content = FileHelper::fileGetContents('file.txt') ?: throw new \RuntimeException('File not found');
Laravel-Specific Conflicts:
Str::slug vs. StrHelper::slug) may cause confusion.StrHelper for typed operations).PHPStan Configuration Overrides:
# phpstan.neon
extends:
- vendor/elasticms/helpers/phpstan/extension.neon
- phpstan-custom-rules.neon
Runtime vs. Static Analysis:
JsonHelper::encode(invalid_data); // PHPStan passes, but may throw at runtime.
$data = JsonHelper::encode($array);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \InvalidArgumentException('Invalid JSON data');
}
PHPStan False Positives:
@return types).--level=max may be too strict).IDE Autocompletion:
vendor/elasticms/helpers is included in PHPStan’s autoload.Performance Bottlenecks:
xdebug run-script -- php -d xdebug.mode=profile app/console
microtime(true).Partial Adoption:
array_map, json_encode) and expand gradually.Custom Helpers:
use Elastic\Helpers\BaseHelper;
class AppHelper extends BaseHelper {
public static function customMerge(array ...$arrays): array {
return array_merge(...$arrays);
}
}
PHPStan Baselines:
vendor/bin/phpstan analyse --generate-baseline
Laravel Facades:
// app/Facades/HelperFacade.php
namespace App\Facades;
use Elastic\Helpers\ArrayHelper;
use Illuminate\Support\Facades\Facade;
class HelperFacade extends Facade {
protected static function getFacadeAccessor() { return ArrayHelper::class; }
}
Then use Helper::arrayFilter() globally.Changelog Awareness:
Community Gaps:
array_reduce, preg_match) via PRs to the [elasticMSHow can I help you explore Laravel packages today?