11
MayLaravel Hashids is a small package to generate YouTube-like IDs from numbers. It converts numbers like 347
into strings like yr8
.
You can install this package via composer:
composer require bvtterfly/laravel-hashids
You can publish the config file with:
php artisan vendor:publish --tag="hashids-config"
Your Eloquent models should have the Bvtterfly\LaravelHashids\HasHashId
trait that contains an abstract getHashIdOptions
method that you must implement yourself, and it should return the Bvtterfly\LaravelHashids\HashIdOptions
class.
Your models’ migrations should have a field to save the generated hashid
to.
Here’s an example of what a model would look like:
namespace App\Models;
use Bvtterfly\LaravelHashids\HasHashId;
use Bvtterfly\LaravelHashids\HashIdOptions;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasHashId;
public function getHashIdOptions(): HashIdOptions
{
return HashIdOptions::create()->saveHashIdTo('hashid');
}
}
By default, the Package will generate hashids from the models’ id.
And Its migration:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('hashid')->nullable(); // Field name same as your `saveHashIdTo`
//...
$table->timestamps();
});
}
}
The hashid
column is generated from the id
field, But id
is an auto-increment column and doesn’t have value before saving in the DB. So, The hashid
column must be nullable. And The Package will generate hashid
and update the model after being saved in the database.
If you want to generate hashids from hex numbers like Mongo’s ObjectIds
, you can change the type to the hex:
public function getHashIdOptions(): HashIdOptions
{
return HashIdOptions::create()
->saveHashIdTo('hashid')
->setType('hex') // default = int
;
}
public function getHashIdOptions(): HashIdOptions
{
return HashIdOptions::create()
->saveHashIdTo('hashid')
->generateHashIdFrom('custom_key')
;
}
By default, This package will generate hashids and update the model from the auto-incremented id
column after being saved in the database. Still, if your field has value, you can change it to generate hashids while saving:
public function getHashIdOptions(): HashIdOptions
{
return HashIdOptions::create()
->saveHashIdTo('hashid')
->setAutoGeneratedField(false)
;
}
To use the hashids in routes, you may specify the hashid
column in the route parameter definition:
use App\Models\Post;
Route::get('/posts/{post:hashid}', function (Post $post) {
return $post;
});
or If you would like model binding to always use the hashid
column other than id
when retrieving a given model class, you may override the getRouteKeyName
method on the Eloquent model:
/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'hashid';
}
This package has a lot more, If you want to learn more about it you can visit its complete documentation and source code on Github
Published at : 11-05-2022
I am a highly results-driven professional with 12+ years of collective experience in the grounds of web application development especially in laravel, native android application development in java, and desktop application development in the dot net framework. Now managing a team of expert developers at Codebrisk.
Launch project