php - 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]') 这样的冗余调用。
有任何想法吗?
解决方案
在你的函数中使用显式路由模型绑定RouteServiceProvider
boot
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
required 就像您的if ($slug !== $abc->slug)
支票一样
推荐阅读
- java - 如何从图像视图中裁剪图像的屏幕可见部分并将其存储?
- css - 滑块图像加载时间和显示问题
- android - v3.2 安卓资源编译失败
- c# - 为什么我的 Azure 函数没有在 App Insights 中记录正确的异常?
- python-3.x - 将 for 循环的结果添加到嵌套字典中的相同键
- javascript - 用于验证字段的正则表达式
- javascript - 将 Google 驱动器中的图像插入工作表
- azure - 复制完成后 CloudBlockBlob.StartCopyAsync 是否返回?
- node.js - 无法从 node/react 访问生产中的 graphql
- javascript - 子元素上的 className 影响父元素