Installation:
composer require netsells/hash-model-ids
php artisan vendor:publish --tag=hash-model-ids-config
Add HASH_MODEL_IDS_SALT to .env (e.g., HASH_MODEL_IDS_SALT=your_unique_salt_here).
Apply Trait:
Use the HashesModelIdsTrait in your Eloquent model:
use Netsells\HashModelIds\HashesModelIdsTrait;
class User extends Model
{
use HashesModelIdsTrait;
}
First Use Case: Access the hashed ID directly:
$user = User::find(1);
echo $user->hashed_id; // e.g., "abc123xyz"
Querying by Hashed IDs:
// Single hashed ID
$user = User::whereHashedId($hashedId)->first();
// Multiple hashed IDs
$users = User::whereHashedIds([$hashedId1, $hashedId2])->get();
Route Binding: Define routes using hashed IDs for implicit binding:
Route::get('/users/{user}', [UserController::class, 'show']);
Access via URL:
$url = route('users.show', ['user' => $user->hashed_id]);
Form Validation: Validate hashed IDs in requests:
use Netsells\HashModelIds\Rules\ExistsWithHashedIdRule;
public function rules()
{
return [
'hashed_id' => [
new ExistsWithHashedIdRule(User::class)
->where('active', true),
],
];
}
Custom Scopes: Extend the trait for custom logic:
class User extends Model
{
use HashesModelIdsTrait;
public function scopeActive($query)
{
return $query->where('active', true);
}
}
/profile/{hashed_id}).Cache::remember()).$this->app->instance('hash.model_ids.salt', 'test_salt');
Salt Management:
HASH_MODEL_IDS_SALT to version control. Use .env.Route Binding Conflicts:
getRouteKeyName() (default: hashed_id).getRouteKey() if needed:
public function getRouteKey()
{
return $this->hashed_id;
}
Performance:
whereHas with hashed IDs).hashed_id column in your database for faster lookups:
Schema::table('users', function (Blueprint $table) {
$table->string('hashed_id')->unique();
});
Collision Risk:
Invalid Hashed IDs:
HashModelIds::generateHash($id) to verify hash generation.Route Binding Failures:
hashed_id column exists and is populated. Debug with:
dd($user->hashed_id, $user->getRouteKey());
Custom Hashing: Override the hash generation logic:
use Netsells\HashModelIds\HashModelIds;
class CustomUser extends Model
{
use HashesModelIdsTrait;
protected function getHashedIdAttribute($value)
{
return HashModelIds::generateHash($this->id, 'custom_salt');
}
}
Additional Query Methods: Extend the trait to add custom scopes:
public function scopeWhereHashedIdLike($query, $search)
{
return $query->where('hashed_id', 'like', "%{$search}%");
}
Middleware: Validate hashed IDs in middleware:
public function handle($request, Closure $next)
{
if ($request->hashed_id) {
$model = Model::whereHashedId($request->hashed_id)->firstOrFail();
}
return $next($request);
}
Database Events: Listen for model events to regenerate hashed IDs:
Model::created(function ($model) {
$model->forceFill(['hashed_id' => HashModelIds::generateHash($model->id)])->save();
});
How can I help you explore Laravel packages today?