Installation:
composer require binary-cats/laravel-sku
The package auto-registers via SkuServiceProvider.
Publish Config (optional):
php artisan vendor:publish --provider="BinaryCats\Sku\SkuServiceProvider" --tag="config"
Default config: config/laravel-sku.php.
First Use Case:
Add a sku column to your model table (e.g., products):
php artisan make:migration add_sku_to_products_table --table=products
Migration:
Schema::table('products', function (Blueprint $table) {
$table->string('sku')->unique()->nullable();
});
Generate SKU on Save:
Use the HasSku trait in your model:
use BinaryCats\Sku\Concerns\HasSku;
class Product extends Model
{
use HasSku;
protected $fillable = ['name', 'sku'];
}
Now, saving a model auto-generates an SKU:
$product = new Product(['name' => 'Laravel Hoodie']);
$product->save();
echo $product->sku; // e.g., "LAR-80564492"
Model Integration:
HasSku trait to enable SKU generation.skuField() to specify the field driving SKU logic (e.g., name):
public function skuField()
{
return 'name';
}
Custom SKU Logic:
generateSku() to customize generation:
protected function generateSku(): string
{
return Str::of($this->name)->upper()->replace(' ', '-') . '-' . $this->incrementingId;
}
Validation:
sku is unique in migrations:
$table->string('sku')->unique();
$request->validate(['sku' => 'required|unique:products']);
Bulk Operations:
generateSkuFor() to manually generate SKUs for existing records:
Product::whereNull('sku')->get()->each->generateSkuFor();
return ProductResource::collection(Product::all());
$product->sku = Str::sku($product->name);
Duplicate SKUs:
sku is unique in migrations.generateSku():
while (Product::where('sku', $this->sku)->exists()) {
$this->sku = $this->generateSku() . '-duplicate';
}
Performance:
chunk() for large datasets).protected static function booted()
{
static::updating(function ($model) {
$model->sku = Str::sku($model->name);
});
}
Config Overrides:
config/laravel-sku.php) may conflict with defaults. Review:
'default' => [
'prefix' => env('SKU_PREFIX', 'LAR'),
'length' => 8,
'separator' => '-',
],
\Log::debug('Generated SKU', ['sku' => $this->sku, 'model' => $this->getTable()]);
HasSku is used and skuField() is defined. Test with:
$model->generateSku(); // Manually trigger to debug.
Custom Generators:
BinaryCats\Sku\Generators\BaseGenerator:
class CustomGenerator extends BaseGenerator
{
public function generate(): string
{
return 'CUST-' . Str::random(6);
}
}
AppServiceProvider:
Sku::extend('custom', function () {
return new CustomGenerator();
});
Dynamic Prefixes:
Product::created(function ($product) {
$product->update(['sku' => 'PRO-' . Str::after($product->sku, 'LAR-')]);
});
Localization:
Str::sku() for non-English fields:
Str::macro('sku', function ($value) {
return Str::of($value)->ascii()->upper()->sku();
});
How can I help you explore Laravel packages today?