Laravel + Hashids
Everyone nowadays used youtube or any short link creator. If you look to the links they use (eg.
https://youtu.be/qatmJtIJAPw) you will notice that they use unique string hashes instead of common auto-increment ids. They do it because anyone can just iterate ids and get access to all their content. And of course they don’t want it.
If you want to protect your content too, you have to replace your ids with hashes. There are lots of tools that can convert integers to unique hash ids. They work practically identically, and I will show how to integrate one of them Hashids with Laravel.
There are lots of packages that already integrate Hashids into Laravel, but they only add it’s facade and give some syntactic sugar. But we need complex integration with easy model binding and all logic under the hood! So let’s do the magic!
First of all you have to install package
lanin/laravel-hashids via composer.
$ composer require lanin/laravel-hashids
Then register a ServiceProvider that will extend default Router and provide you with all needed functionality.
Last thing add
\Lanin\Laravel\Hashids\UseHashidsRouter trait to your
App\Http\Kernel. This will force Laravel to use package router to dispatch the route.
class Kernel extends HttpKernel
After the installation, Router’s method
model that binds your placeholders ids to the models will be updated to automatically support hashids and convert them to the internal integer ids.
Thats it! Binding part is done.
If you will pass hash id to the url it will be easily resolved into an associated model. But how replace ids in your html output? There are two ways. Everything depends on how you form your urls.
If you prefer form them by hands, package gives you the blade helper method
@hashids($id) that will convert your id to the hash string.
But this method is tedious. And I prefer using awesome Laravel feature that automatically extracts ids from models and inserts them into your urls. Example:
url('page', ['id' => $page]);
This methods were updated to handle Hashids too. They will automatically replace integer ids from your models to Hashids.
If for some reason you don’t want to convert them, just implement
\Lanin\Laravel\Hashids\DoNotUseHashidsinterface in your model.
This package is also provides Hashids Facade. It can proxy all Hashids API.
To enable it, add facade in your
'Hashids' => Lanin\Laravel\Hashids\HashidsFacade::class,
By default package will use your
APP_KEY as a salt and 4 symbols length for the hash. If you want to overwrite it, publish hashids configs and edit
$ php artisan vendor:publish
Please feel free to fork this package and contribute by submitting a pull request to enhance the functionalities.