我正在考虑switching to laravel我的下一个项目。
我的下一个项目可能是一个带有一些静态页面的小站点,一个博客和一个项目经理,并且将使用控制器而不是路径。
我很好奇的是如何管理Laravel中的动态路线。
基本上,我想构建一个管理部分,以便我可以轻松地动态创建静态页面,静态页面将具有SEO焦点网址,例如http://domain.com/when-it-started我不想为每个页面手动创建新的控制器或路由。
所以我想知道最清洁的方法是什么。
基本上所有静态页面都将共享相同的视图,只需要更改几个变量。
动态路由应该使用控制器而不是。
E.g。如果我们有一个带有函数about
的控制器staff
,那么这应该通过http://domain.com/about/staff加载
但是我们没有函数players
,所以对http://domain.com/about/players的调用应该检查数据库以查看动态路由是否存在并匹配。如果确实显示,则显示404页面。同样对于不存在的控制器。 (例如,不会有when-it-started
控制器!)
选择的答案在Laravel 4中似乎不起作用。对此有任何帮助吗?
答案 0 :(得分:17)
Laravel 4执行此操作
Route::get('{slug}', function($slug) {
$page = Page::where('slug', '=', $slug)->first();
if ( is_null($page) )
// use either one of the two lines below. I prefer the second now
// return Event::first('404');
App::abort(404);
return View::make('pages.show', array('page' => $page));
});
// for controllers and views
Route::get('{page}', array('as' => 'pages.show', 'uses' => 'PageController@show'));
答案 1 :(得分:8)
您可以使用路线通配符作为工作,您可以从(:any)
开始,如果您需要多个网址段,请添加一个可选的(:all?)
,然后从slug中识别该页面。
例如:
Route::get('(:any)', function($slug) {
$page = Page::where_slug($slug)->first();
if ( is_null($page) )
return Event::first('404');
return View::make('page')->with($page);
});
答案 2 :(得分:2)
与查尔斯的答案非常相似,但在控制器中:
public function showBySlug($slug) {
$post = Post::where('slug','=',$slug)->first();
// would use app/posts/show.blade.php
return View::make('posts.show')->with(array(
'post' => $post,
));
}
然后你可以像这样路由它:
Route::get('post/{slug}', 'PostsController@showBySlug')
->where('slug', '[\-_A-Za-z]+');`
...它有额外的好处,可以让你轻松地直接链接到索引页面上的slug路线,例如:
@foreach ($posts as $post)
<h2>{{ HTML::link(
action('PostsController@showBySlug', array($post->slug)),
$post->title
)}}</h2>
@endforeach