laravel中的动态网址?
Posted
技术标签:
【中文标题】laravel中的动态网址?【英文标题】:Dynamic urls in laravel? 【发布时间】:2012-12-01 08:40:34 【问题描述】:我正在为我的下一个项目寻找 switching to laravel。
我的下一个项目可能会是一个包含几个静态页面、一个博客和一个项目经理的小站点,并且将使用控制器而不是路由。
我很好奇的是如何在 Laravel 中管理动态路由。
基本上,我想建立一个管理部分,这样我就可以轻松地动态创建静态页面,并且静态页面将具有以 SEO 为重点的 url,例如http://domain.com/when-it-started我不想为每个页面手动创建新的控制器或路由。
所以我想知道最干净的方法是什么。
基本上所有静态页面都将共享相同的视图,只需更改一些变量。
动态路由应该与控制器一起工作,而不是代替。
例如如果我们有一个控制器 about
和一个函数 staff
那么这应该通过 http://domain.com/about/staff 加载
但是我们没有函数players
,所以调用http://domain.com/about/players 应该检查数据库以查看是否存在动态路由并匹配。如果确实显示,则显示 404 页面。对于不存在的控制器也是如此。 (例如,不会有 when-it-started
控制器!)
选择的答案似乎在 Laravel 4 中不起作用。对此有什么帮助吗?
【问题讨论】:
@anujarora 任意用粗体强调问题/答案的词语以“更好地突出”不被认为是一个好的编辑。实际上,它可以被认为是有害的。请看一下Is editing posts to only introduce bold emphasis acceptable?。 我没有为强调而付出额外的努力。我只强调了应该引起注意并有助于更好理解的词。 @anujarora 但 Xavi 的观点是这种编辑类型被社区的大多数成员认为是不可接受的。修正语法和拼写很好,但添加“强调”并不是要添加到帖子中的内容。请到 Xavi 提供的链接讨论 好的。我会阅读整个问题,然后判断它是否需要一些编辑。并且只编辑拼写错误和未突出显示的代码。 【参考方案1】:对于 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'));
【讨论】:
它是如何工作的?页面是模型?视图/控制器的要求是什么? 是页面是一个模型,更新后显示使用控制器和视图的代码。希望对您有所帮助。【参考方案2】:您可以在作业中使用路由通配符,您可以从 (:any)
开始,如果您需要多个 url 段添加可选的 (: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);
);
【讨论】:
【参考方案3】:与查尔斯的回答非常相似,但在控制器中:
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
【讨论】:
以上是关于laravel中的动态网址?的主要内容,如果未能解决你的问题,请参考以下文章