【发布时间】:2015-05-08 13:54:15
【问题描述】:
我正在制作具有 CMS 的 laravel 应用程序,该应用程序的页面存储在数据库中。数据库中的一条页面记录有一个 id、title、content 和 url slug。
我想要它,这样如果有人访问 url slug,它就会加载一个页面来显示该页面的内容。所以我认为我需要覆盖 404 处理程序,以便说用户在 404 之前访问 mysite.com/about,它会检查数据库以查看是否有关于存储为 url slug 的记录。如果有,它将加载页面以显示内容,否则它将 404。通过以下解决方案,我已经完成了 90%:
我已将 App\Exceptions\handler.php 中的渲染方法修改为如下:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
$page = Page::where('url', '=', Request::segment(1))->first();
if(!is_null($page)) {
return response(view('page', [ 'page' => $page ]));
}
}
return parent::render($request, $e);
}
这可行,但是有一个问题,我的所有菜单也都存储在数据库中,并且我有一个制作的 FrontendController,它可以从数据库中获取所有菜单以加载到视图中。我所有的控制器都扩展了 FrontendController 以便在每次页面加载时完成,我不必重复任何代码。那么有没有一种方法可以通过控制器路由所有 404,以便它可以扩展我的 FrontendController?还是我只需要重复前端控制器在异常处理程序文件中执行的所有逻辑?
【问题讨论】:
-
为什么不创建一个控制器来执行此操作?创建一个
page控制器,然后将 slug 作为参数传递,那么您的所有页面都将是/page/slug。