繁体   English   中英

Laravel - 在每个请求中更正 url 的最佳方法?

[英]Laravel - Best way to correct the url on every request?

在特定型号中纠正 url 的最佳方法是什么? 我有几个带有蛞蝓的模型,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');

在每个 controller 上,我都这样问:

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

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

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

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

有任何想法吗?

RouteServiceProviderboot function 中使用显式路由 Model 绑定

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
    });
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM