首页 > 解决方案 > Laravel - 纠正每个请求的网址的最佳方法?

问题描述

在特定型号中更正网址的最佳方法是什么?我有几个带有蛞蝓的模型,并且 url 架构是:

Route::get('/abc/{id}/{slug?}', 'AbcController@show')->name('abc.show');
Route::get('/abc/{id}/{slug?}/def-show', 'AbcDefController@show')->name('abc.def.show');
Route::get('/abc/{id}/{slug?}/def', 'AbcDefController@create')->name('abc.def.create');

在每个控制器上,我都这样问:

if ($slug !== $abc->slug) {
    return redirect()->to(route([controller-function-specific], [$abc->id, $abc->slug]));
}

return view('[blade-template]', compact(['abc']))->withCanonical($abc->slug);

更好的方法是什么?我用观察者(“检索”)尝试了它,但我不需要控制器中的每个功能/动作(例如“索引”,它只列出所有元素并且不需要 slug),而且路线也不同。

我的解决方案有效,但它是多余的,因为我将这个特定部分插入到很多功能/操作中。我可以将它写入模型,但这并不能解决像 checkSlug('[ROUTE]') 这样的冗余调用。

有任何想法吗?

标签: phplaravelslug

解决方案


在你的函数中使用显式路由模型绑定RouteServiceProviderboot

public function boot()
{
    parent::boot();

    Route::bind('abc', function($value) {
      return \App\Abc::where('id', $value)
                     ->where('slug', $value)->first() ?? 
                      redirect(); // Custom resolution logic here
    });
}

请注意,这使得slugrequired 就像您的if ($slug !== $abc->slug)支票一样


推荐阅读