Installation
composer require develia/commons
Add to composer.json under require-dev if only needed for development:
"require-dev": {
"develia/commons": "^1.0"
}
First Use Case: Logging & Debugging
Import the Logger helper in your controller or service:
use Develia\Commons\Logger;
public function index()
{
Logger::info('User accessed the dashboard', ['user_id' => auth()->id()]);
}
src/Logger.php for available log levels (debug, info, warning, error, critical).storage/logs/develia.log (configurable via config/develia.php).String Manipulation
Use Develia\Commons\StringHelper for common operations:
use Develia\Commons\StringHelper;
$slug = StringHelper::slugify('Laravel 10 Best Practices');
// Output: "laravel-10-best-practices"
Array/Collection Helpers
use Develia\Commons\ArrayHelper;
$filtered = ArrayHelper::filterByKey($array, ['active', 'published']);
Request Validation
Extend Develia\Commons\Http\RequestValidator to enforce custom rules:
use Develia\Commons\Http\RequestValidator;
class ApiValidator extends RequestValidator
{
protected $rules = [
'api_token' => 'required|api_token_valid',
];
}
Route::middleware([ApiValidator::class])->group(function () {
// Protected routes
});
Response Wrapping
Use Develia\Commons\Http\ResponseWrapper to standardize API responses:
return ResponseWrapper::success($data, 'Data fetched successfully');
Query Scoping Add reusable scopes to models:
use Develia\Commons\Database\Eloquent\Scopes\ActiveScope;
class Post extends Model
{
public function scopeActive($query)
{
return $query->apply(new ActiveScope());
}
}
Post::active()->get();
Soft Deletes with Custom Logic
Override Develia\Commons\Database\Eloquent\SoftDeletes:
class User extends Model
{
use SoftDeletes, DeletesWithLog;
protected $logMessage = 'User deleted by {user}';
}
Develia\Commons\Events\BaseEvent:
class UserRegistered extends BaseEvent
{
public $user;
public $plan;
public function __construct($user, $plan)
{
$this->user = $user;
$this->plan = $plan;
}
}
event(new UserRegistered($user, 'premium'));
Event::listen(UserRegistered::class, function ($event) {
Logger::info('New user registered', ['plan' => $event->plan]);
});
Develia\Commons\Testing\MockHelper in PHPUnit:
$mock = MockHelper::mock(User::class, [
'name' => 'Test User',
'email' => '[email protected]',
]);
Logger Configuration Overrides
config/develia.php is missing, logs default to storage/logs/develia.log. Tip: Publish config first:
php artisan vendor:publish --provider="Develia\Commons\CommonsServiceProvider" --tag="config"
LOG_CHANNEL in .env conflicts with the package’s logger.Middleware Priority
RequestValidator must be placed before auth middleware to validate tokens early.app/Http/Kernel.php:
'api' => [
\App\Http\Middleware\CheckForApiToken::class,
\Develia\Commons\Http\RequestValidator::class,
// ...
],
Soft Deletes Race Conditions
DeletesWithLog uses a queue job. Ensure queue:work is running or set sync in config:
'deletes' => [
'queue' => env('QUEUE_CONNECTION', 'sync'),
],
StringHelper Edge Cases
slugify() removes all non-alphanumeric characters by default. Use slugify($str, '-', true) to preserve hyphens/spaces.APP_DEBUG=true in .env to log stack traces for Logger errors.config/develia.php don’t apply, clear config cache:
php artisan config:clear
SoftDeletes, ensure your model doesn’t already define bootSoftDeletes().Custom Log Handlers
Extend Develia\Commons\Logger\Handler\BaseHandler to add Slack/Email alerts:
class SlackHandler extends BaseHandler
{
public function log($level, $message, array $context)
{
// Send to Slack API
}
}
Register in config/develia.php:
'handlers' => [
\Develia\Commons\Logger\Handler\SlackHandler::class,
],
Dynamic Request Rules
Override Develia\Commons\Http\RequestValidator::rules() to fetch rules from a database:
public function rules()
{
return Cache::remember('api_rules', 60, function () {
return ApiRule::all()->pluck('rule');
});
}
Event Payload Serialization
For complex events, implement JsonSerializable in your event class:
class OrderProcessed extends BaseEvent implements JsonSerializable
{
public function jsonSerialize()
{
return [
'order_id' => $this->order->id,
'total' => $this->order->total,
];
}
}
ActiveScope should not eager-load relationships unless necessary:
// Bad: Loads all relations for every active record
Post::active()->with(['author', 'comments'])->get();
// Good: Load only what you need
Post::active()->get()->load(['author']);
Develia\Commons\Logger\BatchableInterface.How can I help you explore Laravel packages today?