Installation Add the package via Composer:
composer require zerkalica/millwright-util
No additional configuration is required for basic usage.
First Use Case: Service Tag Aggregation
If using Laravel's service container (which extends Symfony's DI container), leverage ContainerUtil to aggregate services by tag:
use Zerkalica\MillwrightUtil\ContainerUtil;
// In a service provider or controller
$aggregatedServices = ContainerUtil::getAggregatedServices($container, 'my.tag');
First Use Case: Safe Array Merge
Use PhpUtil for safe array merging (avoids overwriting existing keys):
use Zerkalica\MillwrightUtil\PhpUtil;
$merged = PhpUtil::safeMerge(
['key1' => 'value1', 'key2' => 'value2'],
['key2' => 'overwritten', 'key3' => 'value3']
);
// Result: ['key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3']
First Use Case: SQL Date Formatting
Use DateUtil constants for consistent SQL date formatting:
use Zerkalica\MillwrightUtil\DateUtil;
$formattedDate = (new \DateTime())->format(DateUtil::SQL_DATETIME);
Tag-Based Service Aggregation
Use ContainerUtil::getAggregatedServices() to group services by tags (e.g., for middleware, event listeners, or custom logic):
// In a service provider
$this->app->tag(['service1', 'service2'], 'my.tag');
$services = ContainerUtil::getAggregatedServices($this->app, 'my.tag');
Configuration Merging Merge configurations safely (e.g., for environment-specific overrides):
$baseConfig = require config('base.php');
$envConfig = require config('env.php');
$mergedConfig = PhpUtil::safeMerge($baseConfig, $envConfig);
Assertions for Input Validation
Use PhpUtil::assert* methods to validate data early:
PhpUtil::assertArrayHasKey('user_id', $request->all(), 'User ID is required');
Safe Cloning of Objects
Avoid deep-copy pitfalls with PhpUtil::safeClone():
$original = new MyClass();
$clone = PhpUtil::safeClone($original); // Handles circular references
Date Handling in Queries Standardize date formats for Eloquent queries:
$date = (new \DateTime())->format(DateUtil::SQL_DATE);
User::whereDate('created_at', '=', $date)->get();
ContainerUtil in register() to organize tagged services.$middleware = ContainerUtil::getAggregatedServices($this->app, 'web.middleware');
safeMerge for environment-specific config overrides.ContainerUtil Assumptions
if ($container instanceof ContainerInterface) checks.PhpUtil::safeMerge Quirks
array_merge_recursive for nested structures if needed.DateUtil Constants
SQL_DATETIME may vary by MySQL version).config(['millwright.date_format' => DateUtil::SQL_DATETIME]);
Tagged Services Missing
getAggregatedServices().dd($container->findTagged('my.tag'));
Safe Merge Unexpected Behavior
var_dump($merged, $original, $override) to compare inputs/outputs.debug: true flag to safeMerge for verbose logging.Circular References in safeClone
safeClone may fail silently. Use PhpUtil::isSafeToClone() first:
if (!PhpUtil::isSafeToClone($object)) {
throw new \RuntimeException('Object contains circular references');
}
Custom Assertions
Extend PhpUtil by adding static methods:
// In a helper file
use Zerkalica\MillwrightUtil\PhpUtil;
if (!PhpUtil::assertStringStartsWith($str, 'prefix')) {
// Handle error
}
New Date Formats
Add constants to DateUtil in a trait or subclass:
trait CustomDateUtil {
public const CUSTOM_FORMAT = 'Y-m-d H:i:s.u';
}
Container Utilities
Extend ContainerUtil for Laravel-specific features (e.g., binding aggregated services):
$services = ContainerUtil::getAggregatedServices($app, 'my.tag');
$app->bind('my.tagged.services', fn() => $services);
$this->app->singleton('cached.tagged.services', fn() =>
ContainerUtil::getAggregatedServices($this->app, 'my.tag')
);
How can I help you explore Laravel packages today?