我正在开发一个带有数据库驱动菜单系统的内容管理系统,该系统允许用户为routes.php
中定义的应用程序路径生成SEO友好URL。
例如,用户使用所需的路径/about-us
为页面创建菜单项。发出请求时,应用程序会检查数据库中当前路径是否存在别名,然后根据其别名路由请求。
所需的结果是,当您请求/about-us
时,应用程序实际将其视为/pages/1
,但用户会在地址栏中看到/about-us
。
用户需要能够链接到任何资源,而不仅仅是页面 - 所以类别,帖子等
示例菜单项模型:
{
"id": 1,
"name": "About us page",
"path": "/about-us",
"alias": "/pages/1"
}
目标路线示例:
Route::get('pages/{id}', 'PageController@show');
Route::get('categories/{id}', 'CategoryController@show');
我想也许我可以使用在REQUEST_URI
中注册的before过滤器覆盖start/global.php
变量,但这没有效果。
App::before(function(\Illuminate\Http\Request $request)
{
$request_uri = $request->server->get('REQUEST_URI');
$request_uri_string = urldecode(substr($request_uri, 1));
if (strlen($request_uri_string)>1)
{
if ($menuItem = MenuItem::where('path', '=', $request_uri_string)->first())
{
$request->server->set('REQUEST_URI', $menuItem->alias);
}
}
});
任何想法如何实现这一目标?
答案 0 :(得分:0)
我相信通过扩展\Illuminate\Http\Request
并将此自定义请求类注入bootstrap/start.php
中的应用程序,我找到了解决方案。
自定义请求类:
namespace Vendor\Package;
class Request extends \Illuminate\Http\Request {
/**
* Override the request uri so we can create menu aliases
*
* @param $value
*/
public function setRequestUri($value)
{
$this->requestUri = $value;
$this->pathInfo = $value;
$this->server->set('REQUEST_URI', $value);
}
}
将自定义Request类注入bootstrap/start.php
$request = \Vendor\Package\Request::createFromGlobals();
$app = new Illuminate\Foundation\Application($request);
检查是否存在具有请求路径的菜单项,并将请求uri设置为别名(app/start/global.php
)。
App::before(function(Vendor\Package\Request $request)
{
$request_uri = $request->server->get('REQUEST_URI');
$request_uri_string = urldecode(substr($request_uri, 1));
if (strlen($request_uri_string)>1)
{
if ($menuItem = MenuItem::where('path', '=', $request_uri_string)->first())
{
$request->setRequestUri($menuItem->alias);
}
}
});