如何在Laravel 4中创建数据库驱动的路由别名?

时间:2015-02-27 10:35:00

标签: php laravel routing

我正在开发一个带有数据库驱动菜单系统的内容管理系统,该系统允许用户为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);
        }
    }
});

任何想法如何实现这一目标?

1 个答案:

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