【问题标题】:Laravel routing: static text in optional url segmentLaravel 路由:可选 url 段中的静态文本
【发布时间】:2014-09-08 20:34:19
【问题描述】:

我正在将我网站的论坛部分迁移到 Laravel 4。我自己管理分页。 (不是 Laravel 内置的)

我的网址目前使用以下格式:

example.com/forum
example.com/forum/page-1

我想在迁移后保持这种状态。

我的路线是这样的:

Route::get('/forum/page-{page?}',
    array('uses' => 'ForumController@showForum', 'as' => 'forum'));

但是当我请求没有页码的页面时它当然不起作用。

我可以像/forum/{pagetext?}-{page?} 那样做,但我不想在我的控制器中捕获 pagetext 参数,我只想在使用 URL::route() 为页面构建 url 时提供 $page 参数.

我在 Internet 上找到了很多示例,但它总是带有多个参数,没有静态可选文本。

我怎样才能使这个“静态”部分也成为可选的?

我正在考虑像正则表达式中的可选组,比如/forum/(page-{page})?,但我如何在 Laravel 中做到这一点?

【问题讨论】:

  • 那你为什么希望它是可选的呢?您可以将 forum url 作为 1 个路由,将 forum/page-{page} 作为另一个路由,如果需要,两者都使用相同的控制器(方法)。
  • @JarekTkaczyk 我一开始就想到了这一点,但忘记了。谢谢你提到它。它给人的印象是有两条路线,但那是一条完全相同的路线,所以对我来说这看起来不太好。但它看起来是一个非常好的方法来拥有干净的参数

标签: php url laravel-4


【解决方案1】:

如果你真的需要参数是可选的,我会将该路由的整个段设为一个参数,你可以使用正则表达式来强制它:

Route::get('/forum/{page?}', function($page = null) {
    echo 'On page ' . $page;
})->where('page', 'page-[\d]+');

这里的缺点是您必须从路线中获取数字页码。

正如@Jarek 在 cmets 中提到的,您还可以将其拆分为两条不同的路线:

Route::get('/forum', function() {
    echo 'Forum Index';
});

Route::get('/forum/page-{page}', function($page) {
    echo 'On page ' . $page;
})->where('page', '[\d]+');

【讨论】:

  • 如果没有办法在 Laravel 中“本地”执行(无需进一步操作参数内容),@Jarek 解决方案看起来像一个干净的解决方案。我只是想念用相同的路由名称调用它们,并传递一个 null 或页数来在它们之间进行切换的可能性。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2015-05-26
  • 1970-01-01
  • 2019-02-19
  • 2018-04-03
  • 2019-10-03
相关资源
最近更新 更多