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
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)
我将模板文件信息保存在数据库中,因为我允许用户在内容管理系统中创建模板.
然后,查询对数据库的响应将传递到视图,在该视图中可以将其输出到元数据,页面,面包屑等.
| 归档时间: |
|
| 查看次数: |
23175 次 |
| 最近记录: |