在laravel 5.8中,我有两种类型的url。
/ news / {category}->发送到新闻控制器索引操作(如果具有类别绑定) / news / {news}->发送到新闻控制器详细信息操作(如果有新闻绑定) 另一个案例以404中止。
我该如何解决这个问题?
答案 0 :(得分:1)
在Laravel和我所知道的几乎所有框架和路由系统中,路由和控制器/动作的关系是1:1。每个路由只能有一个控制器或动作来处理它。
如果我正确理解了您的问题,则您的路由模式为/news/{parameter}
,并且希望发生以下三种情况之一:
{parameter}
包含有效的类别标签。检索类别并显示适当的视图。
{parameter}
包含有效的Article(细节)条。检索文章并显示适当的视图。
{parameter}
没有包含有效的类别或文章条目,因此找不到。返回404错误。
您仍然只需要一个控制器动作,但是您可以将逻辑分开以使其易于理解:
routes / web.php:
Route::get('/news/{param}', 'NewsController@index');
app / Http / Controllers / NewsController(带有伪代码):
class NewsController extends Controller
{
public function index(string $param)
{
if ($category = Category::whereSlug($param)->first()) {
// Return your category view.
}
if ($article = Article::whereSlug($param)->first()) {
// Return your article view.
}
\abort(404);
}
}
我个人建议不要像这样为两种不同的实体类型共享通用的URL结构。它打开了名称冲突的可能性(“类别”和“文章”具有相同的标记),并且可能使用户体验混乱。 (这也可能会损害搜索引擎的优化或结果,但这只是猜测-我没有任何要确认或否认的东西。)