taylornetwork/laravel-username-generator
Installation:
composer require taylornetwork/laravel-username-generator
Publish the config (if needed):
php artisan vendor:publish --provider="TaylorNetwork\LaravelUsernameGenerator\UsernameGeneratorServiceProvider"
Basic Usage:
User model extends TaylorNetwork\LaravelUsernameGenerator\HasUsername.username column (if not already present):
php artisan vendor:publish --provider="TaylorNetwork\LaravelUsernameGenerator\UsernameGeneratorServiceProvider" --tag=migrations
$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
]);
$user->generateUsername(); // Auto-generates username (e.g., "johndoe123")
$user->save();
First Use Case:
UserObserver or Creating event listener to auto-generate usernames during registration:
use TaylorNetwork\LaravelUsernameGenerator\Events\UsernameGenerated;
User::created(function ($user) {
if (empty($user->username)) {
$user->generateUsername();
$user->save();
}
});
Registration Flow:
UserObserver or Creating event:
User::created(function ($user) {
$user->generateUsername()->save();
});
config/username-generator.php):
'generator' => 'TaylorNetwork\LaravelUsernameGenerator\Generators\DefaultGenerator',
'prefix' => 'user_',
'suffix_length' => 3,
'separator' => '_',
Manual Generation:
$user = User::find(1);
$user->generateUsername(); // Overwrites existing username
$user->save();
Validation Integration:
$request->validate([
'name' => 'required|string',
'email' => 'required|email|unique:users',
'username' => 'required|unique:users', // Auto-filled by package
]);
Custom Generators:
TaylorNetwork\LaravelUsernameGenerator\Generators\Generator:
namespace App\Generators;
use TaylorNetwork\LaravelUsernameGenerator\Generators\Generator;
class CustomGenerator extends Generator {
public function generate($name, $email) {
return strtolower(str_replace(' ', '.', $name)) . rand(100, 999);
}
}
AppServiceProvider:
public function register() {
$this->app->bind('username-generator', function () {
return new \App\Generators\CustomGenerator();
});
}
Seeding:
$users = User::factory()->count(10)->create();
foreach ($users as $user) {
$user->generateUsername()->save();
}
RegisterController to auto-generate usernames during API registration.$this->app->instance('username-generator', MockGenerator::class);
separator = – for German).Duplicate Usernames:
DB::transaction(function () use ($user) {
$user->generateUsername();
$user->save();
});
username index in migrations:
Schema::table('users', function (Blueprint $table) {
$table->string('username')->unique()->after('email');
});
Overwriting Usernames:
generateUsername() overwrites existing values. Use generateUniqueUsername() for safer updates:
if (empty($user->username)) {
$user->generateUsername();
} else {
$user->generateUniqueUsername(); // Skips if username exists
}
Generator Cache:
app('username-generator')->clearCache();
Case Sensitivity:
username column collation supports this (e.g., utf8mb4_unicode_ci).Performance:
generateUsername() sparingly in bulk operations.'debug' => env('USERNAME_GENERATOR_DEBUG', false),
dd(app('username-generator')->getCache());
taylordev/laravel-username-generator's test helpers:
$this->assertUsernameGenerated($user, 'johndoe');
Custom Validation:
Override validation rules in User model:
protected static function booted() {
static::updating(function ($user) {
if ($user->isDirty('name') && $user->username) {
$user->generateUniqueUsername();
}
});
}
Event Listeners:
Listen for UsernameGenerated events:
UsernameGenerated::listen(function ($user) {
Log::info("Generated username for {$user->name}: {$user->username}");
});
Dynamic Config: Override config dynamically (e.g., per tenant):
config(['username-generator.prefix' => 'tenant_' . $tenant->slug]);
Fallback Generators: Chain generators for fallback logic:
$generator = app('username-generator');
$username = $generator->generate($name, $email);
if (empty($username)) {
$username = $generator->fallbackGenerate($name, $email);
}
API Responses:
Exclude username from API responses if sensitive:
protected $hidden = ['password', 'remember_token'];
protected $appends = ['username']; // Or exclude via API resources
How can I help you explore Laravel packages today?