Laravel 5:自定义路由


Laravel 5: custom routing

我正在构建一个站点,它有两种不同类型的组件:pages(带有图像和文本的静态文件)和forms(接受输入的动态文档)。我将通过管理面板创建和编辑这两个,因此每个都将有一个Repository模型和控制器。

在Laravel创建如下路线是非常容易的:

Route::match(['get', 'post'], '/pages/{one?}/{two?}/{three?}', 'PagesController@loadPage');
Route::match(['get', 'post'], '/forms/{one?}/{two?}/{three?}', 'FormsController@loadForm');

不幸的是,这将导致使用该网站的人使用一些丑陋的URL:

  • http://www.example.com/pages/
  • http://www.example.com/pages/about-us
  • http://www.example.com/forms/contact-us

我更喜欢从这些链接中删除"页面"或"表单",然后检查数据库以确定要加载哪一个:

  • http://www.example.com/
  • http://www.example.com/about-us
  • http://www.example.com/contact-us

我创建了一个具有两个属性的Path雄辩模型:pathcontroller。所以我目前有以下几种:

Route::match(['get', 'post'], '{one?}/{two?}/{three?}', function() {
    $path = Path::where('path', '=', implode('/', func_get_args()))->take(1)->get()->first();
    // Somehow use $path->controller to load the proper controller
});

我尝试过使用App::make($path->controller),但它抛出错误:"Class PagesController不存在"

我相信我可以在请求到达我的应用程序之前使用中间件来修改请求(因此,在不修改用户看到的URL的情况下,相应地预先挂起"pages/"或"forms/"),但我找不到这样做的方法。

一件简单的事情就是根据数据库记录检查url模式。这就是我对代表复杂网站结构的简单url所做的。您可以使用一个表来存储url字符串和url类型(页面、表单…),每个url都是唯一的。

我做了一个测试来完全满足这个需求。希望你能找到充分的帮助。

我的路线看起来像:以防万一获取方法:

Route::get('test/{param}', array('as' => 'test1', function(){
    return "glade to see you here....1";
}));
Route::get('test/{param}', array('as' => 'test2', function(){
    return "glade to see you here....2";
}));

我的html看起来像:

{{link_to_route('test1',"test1",1)}}
{{link_to_route('test2',"test2",2)}}

好吧,让我重新表述一下,我在这里关注的是用不同的名字定义相似的路线,并通过它们的名字来称呼它们。通过这种方法,你可以达到你的要求。

然而,你可以用不同的名字来定义你的路线,无论你的路线是什么样子,如果还不清楚实现你的目标,请告诉我。