becklyn/utilities
Utility helpers for PHP/Laravel projects: small, reusable functions and classes to simplify common tasks, improve developer ergonomics, and reduce boilerplate across your application and packages.
Installation Require the package via Composer:
composer require becklyn/utilities
No additional configuration is required unless using Laravel-specific features (e.g., service providers).
Where to Look First
src/Utilities directory for available classes.Enum for structured enumerated values.IterableToCollectionConstructionTrait for converting iterables to Laravel Collections.ArrayHelper, StringHelper, LaravelResponse (if Laravel-specific utilities exist).First Use Case Convert an array to a Laravel Collection using the trait:
use Becklyn\Utilities\IterableToCollectionConstructionTrait;
class MyService
{
use IterableToCollectionConstructionTrait;
public function processData(array $data)
{
$collection = $this->toCollection($data);
return $collection->filter(fn($item) => $item['active']);
}
}
Enum Classuse Becklyn\Utilities\Enum;
class UserRole extends Enum
{
public const ADMIN = 'admin';
public const EDITOR = 'editor';
public const USER = 'user';
protected static array $values = [
self::ADMIN => 'Administrator',
self::EDITOR => 'Editor',
self::USER => 'User',
];
}
$role = UserRole::ADMIN; // Returns 'admin'
echo $role->value; // 'admin'
echo $role->label; // 'Administrator'
use Becklyn\Utilities\IterableToCollectionConstructionTrait;
class DataImporter
{
use IterableToCollectionConstructionTrait;
public function import(array $rawData)
{
$collection = $this->toCollection($rawData);
return $collection->map(fn($item) => $this->transform($item));
}
}
$generator = function() { yield 1; yield 2; yield 3; };
$collection = $this->toCollection($generator());
use Becklyn\Utilities\LaravelResponse;
return LaravelResponse::success($data, 'Operation completed');
use Becklyn\Utilities\ArrayHelper;
use Illuminate\Support\Collection;
Collection::macro('deepFlatten', function() {
return ArrayHelper::flatten($this->all());
});
class CustomEnum extends Enum
{
public function getDisplayValue(): string
{
return strtoupper($this->label);
}
}
trait ExtendedCollectionTrait
{
use IterableToCollectionConstructionTrait;
public function customMethod()
{
return $this->filter(fn($item) => true);
}
}
$this->app->bind(MyService::class, function ($app) {
$service = new MyService();
$service->setLogger($app->make(Logger::class));
return $service;
});
public function __construct(private MyService $myService) {}
PHP 8.2+ Requirement
php -v
Laravel Version Compatibility
illuminate/collections ^9). If using Laravel 10/11, verify no breaking changes exist.Enum Type Safety
TypeError:
$invalid = UserRole::INVALID; // Throws error if not defined
Enum::isValid() to check values:
if (UserRole::isValid('admin')) { /* ... */ }
Trait Method Conflicts
IterableToCollectionConstructionTrait may conflict with existing toCollection() methods.use Becklyn\Utilities\IterableToCollectionConstructionTrait as BecklynCollectionTrait;
Undocumented Features
php artisan ide-helper:generate to auto-generate docs:
composer require --dev barryvdh/laravel-ide-helper
php artisan ide-helper:generate
Enable Strict Typing
Add to composer.json to catch type-related issues early:
"config": {
"platform-check": true,
"optimize-autoloader": true,
"preferred-install": "dist"
}
Log Utility Outputs Wrap utility calls in debug logs:
\Log::debug('Enum value:', ['role' => $role->value]);
Test Edge Cases
$this->toCollection([])->dump(); // Should return empty collection
try {
UserRole::from('invalid');
} catch (\InvalidArgumentException $e) {
\Log::error($e->getMessage());
}
Custom Enums
Extend the base Enum class for domain-specific logic:
class PaymentStatus extends Enum
{
public const PENDING = 'pending';
public const COMPLETED = 'completed';
public const FAILED = 'failed';
public function isFinal(): bool
{
return in_array($this->value, [self::COMPLETED, self::FAILED]);
}
}
Collection Macros Add reusable methods to Laravel Collections:
use Becklyn\Utilities\ArrayHelper;
use Illuminate\Support\Collection;
Collection::macro('chunkBy', function ($key) {
return ArrayHelper::chunkBy($this->all(), $key);
});
Service Provider Integration Bind utilities to the Laravel container for global access:
public function register()
{
$this->app->singleton(MyService::class, function ($app) {
$service = new MyService();
$service->setConfig($app['config']['my_service']);
return $service;
});
}
Iterable Conversion Overhead
The toCollection() trait may add minor overhead for large iterables. Benchmark:
$microTime = microtime(true);
$collection = $this->toCollection($largeArray);
\Log::debug('Conversion time:', microtime(true) - $microTime);
Enum Reflection Avoid heavy reflection in performance-critical paths:
// Slow: Avoid in loops
$enumValues = UserRole::getValues();
// Fast: Cache results
static $cachedValues = null;
if (is_null($cachedValues)) {
$cachedValues = UserRole::getValues();
}
No Published Config The package may not publish a config file. Override defaults via environment variables or service binding:
$this->app->bind('config', function () {
return [
'my_service' => [
'timeout' => env('MY_SERVICE_TIMEOUT', 30),
],
];
});
Symfony Dependency
If using Symfony components (e.g., HttpFoundation), ensure compatibility:
composer require symfony/http-foundation ^6.4
public function testEnumValidation()
{
$this->assertTrue(UserRole::isValid('admin'));
$this->assertFalse(UserRole::isValid('invalid'));
}
How can I help you explore Laravel packages today?