Я использую пакет hashids\hashids
для хеширования идентификатора данных, отправленных через URL-адрес (например, .../post/bsdfs/edit, «bsdfs» — это закодированное значение). Я следовал методу доступа Stuart Wagner. сделать это. Ниже показано, как я это делаю:
use Hashids\Hashids;
class Post extends Model {
protected $appends = ['hashid'];
public function getHashidAttribute() {
$hashid = new Hashids(config('hash.keyword'));
return $hashid->encode($this->attributes['id']);
}
}
Перед хешированием идентификаторов я получаю post/2/edit
. После процесса хэширования я получаю post/bsdfs/edit
, что меня вполне устраивает.
Проблема возникает при перенаправлении на закодированный маршрут. Вот так выглядит мой маршрут:
use App\Http\Controllers\PostController;
Route::get('post/{post}/edit', 'PostController@edit')->name('post.edit');
После перенаправления получаю ошибку 404. Вот что принимает контроллер:
Use App\Models\Post;
class PostController extends Controller {
//PS: I don't actually know what this method is called...
public function edit(Post $post) {
return view('post.edit')->with(compact('post'));
}
}
Я знаю, что если я использую этот метод, Laravel ищет идентификатор «bsdfs», которого нет в базе данных. Что он должен сделать, так это декодировать хэш и получить идентификатор. Есть ли способ сделать это БЕЗ этого:
public function edit($id) {
$hashid = new Hashids(config('hash.keyword'));
$id= $hashid->decode($id);
$post = Post::find($id);
return view('post.edit')->with(compact('post'));
}
Как видите, моя цель здесь — уменьшить количество строк, сохраняя при этом идентификатор данных в кодируемом URL-адресе. Любая помощь будет оценена по достоинству. Спасибо.