Laravel 5应用中的动态路由

Bec*_*cky 14 php laravel laravel-5

我希望有人可以帮助我为可能有多个段的URL进行动态路由.我一直在网上搜索一下,但我发现的任何东西都不能帮助我解决我的具体情况.

一点点背景......几年前,我开发了一个基于CodeIgniter构建的自定义客户端网站的CMS包.此CMS包有几个模块(页面,博客,日历,查询等).对于Pages模块,我将路由缓存到"自定义路由"配置文件,该文件将页面的完整路由(包括父级,祖父级等)与页面ID相关联.我这样做是为了让我不必进行数据库查找来查找要显示的页面.

我目前正在使用Laravel(5.1)[正在学习Laravel]重建这个CMS包.在我继续使用新版本的软件包中的Pages模块之前,我需要弄清楚路由情况.

我知道我可以做点像......

// routes.php
Route::get('{slug}', ['uses' => 'PageController@view']);

// PageController.php
class PageController extends Controller
{
    public function view($slug)
    {
        // do a query to get the page by the slug
        // display the view
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我不允许嵌套页面,这将有效,但我这样做.而且我只根据父母强制执行slug的唯一性.所以可能会有不止一个页面上有一段法 ...

  • 位置/法戈
  • 工作人员/法戈

与我使用CodeIgniter构建的包一样,我希望能够避免额外的数据库查找以找到要显示的正确页面.

我最初的想法是创建一个配置文件,其中包含动态路由,就像我使用旧版本的系统一样.路由只会在特定时间更改(创建页面时,修改slug时,更改父级时),因此"缓存"它们会很有效.但我还是Laravel的新手,所以我不确定最好的方法是什么.

我确实设法弄清楚以下路线是否有效.但这是设置它的最佳方式吗?

Route::get('about/foobar', function(){
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [123]);
});

Route::get('foobar', function(){
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [345]);
});
Run Code Online (Sandbox Code Playgroud)

基本上,我想在创建页面时(或更改段塞或父项时)将特定路由绑定到特定页面ID.

我只是过于复杂的事情?

任何有关这方面的帮助或指示将不胜感激.

谢谢!

Jee*_*usu 34

我处理这个的方式是使用两个路由,一个用于主页(通常包含更复杂的逻辑,如新闻,拾取文章,横幅等),以及捕获所有其他页面.

路线

// Home page
Route::get('/', [
    'as'      => 'home',
    'uses'    => 'PageController@index'
]);

// Catch all page controller (place at the very bottom)
Route::get('{slug}', [
    'uses' => 'PageController@getPage' 
])->where('slug', '([A-Za-z0-9\-\/]+)');
Run Code Online (Sandbox Code Playgroud)

上面要注意的重要部分是->where()在路线末端链接的方法.这允许您为路由参数声明正则表达式模式匹配.在这种情况下,我允许参数的字母数字字符,连字符和正斜杠{slug}.

这将匹配像slu
test-page
test-page/sub-page
another-page/sub-page

PageController方法

public function index()
{
    $page = Page::where('route', '/')->where('active', 1)->first();

    return view($page->template)
        ->with('page', $page);
}

public function getPage($slug = null)
{
    $page = Page::where('route', $slug)->where('active', 1);

    $page = $page->firstOrFail();

    return view($page->template)->with('page', $page);
}
Run Code Online (Sandbox Code Playgroud)

我将模板文件信息保存在数据库中,因为我允许用户在内容管理系统中创建模板.

然后,查询对数据库的响应将传递到视图,在该视图中可以将其输出到元数据,页面,面包屑等.

  • 我只想说谢谢你的回答.我花了好几个小时试图找出一种在Laravel 5.2中动态处理子页面路由的好方法.你的建议用` - > where()`方法允许slug中的正斜杠解决了它.虽然它有点不言自明,但我还可以补充说,像所有这样的路径应该(必须?)放在所有其他路径之后,以便例如`admin/pages`不被捕获为一个slug for这条路线. (3认同)