【问题标题】:Laravel 5 - Routes and variable parameters in controllersLaravel 5 - 控制器中的路由和可变参数
【发布时间】:2015-08-13 11:47:09
【问题描述】:

我想在搜索时生成这样的 SEO 友好 URL:
http://www.example.com/search(无过滤器)
http://**www.example.com/search/region-filter
http://**www.example.com/search/region-filter/city-filter

并以这种方式对它们进行分页:
http://www.example.com/search/2(无过滤器,第 2 页)
http://**www.example.com/search/region-filter/2
http://**www.example.com/search/region-filter/city-filter/2

(抱歉,由于声誉问题,我不能发布超过 2 个链接)

所以第二个片段可以是一个过滤器或多个页面(与第三个相同)。

我的 Laravel 5 路由文件:

Route::pattern('page', '[0-9]+');
...
Route::get('search/{region}/{city}/{page?}', 'SearchController@index');
Route::get('search/{region}/{page?}', 'SearchController@index');
Route::get('search/{page?}', 'SearchController@index');

由于“页面”模式,路由可以正常工作,但在控制器内部,此请求 http://**www.example.com/search/2 将 {page} 映射到 $region(即使使用最后的路由规则):

public function index($region='', $city='', $page='')

Codeigniter 参数是按名称映射的,但看起来 Laravel 是按位置映射它们的,所以我总是在 $region 中获取第一个。

是否可以通过名称而不是位置来路由参数,或者使用一些 Laravel 替代方法将它们放入控制器中?(我可以计算段数,但这对我来说是一个丑陋的解决方案) p>

【问题讨论】:

  • 你为什么不做类似这样的公共函数 index($region = NULL, $city = NULL, $page = NULL) 那么,在你的方法中,如果只有 search/{page} 检查如果 $page 是一个整数,如果不是,那么它就是你的区域。但是 $region 将是您的 $page ...我建议您将方法分开用于一个路由。容易多了。
  • 我想过像你说的那样(检查它是否是整数),但我希望 Laravel 有一些机制可以让它更干净。您的意思是另一种选择是创建三个方法,其中一个索引,另外两个“指向”索引并以正确的顺序传递参数?我在 CI 中使用 remap 功能做了类似的事情,但我再次希望 Laravel 会有更好的东西。
  • 我将为您的 3 个路由创建 3 种不同的方法。这样,您可以 100% 确定您将确切知道可以在您的方法中使用什么样的参数。
  • 好的,谢谢。如果没有其他选择,我想我会这样做。我是 Laravel 的新手,我并不完全了解该框架有什么以及什么是好的做法。
  • 最好的方法是查看他们的文档。有大量的服务,您可以提供帮助的帮手。很抱歉无法在这方面为您提供进一步的帮助。祝 Laravel 好运!

标签: php laravel laravel-5 laravel-routing


【解决方案1】:

您可以使用Route::current() 方法访问当前路由并通过parameter method 按名称获取参数。但是,您的路由定义存在问题,这将使最后两个定义的路由无用。

因为您最后两个路由中的page 参数是可选的,取决于路由路径,您的第二个和第三个路由将无法正确匹配,因为路由的定义不明确。下面的测试用例证明了我的观点。


如果你的控制器中有这个:

public function index()
{
    $route = \Route::current();

    $region = $route->parameter('region');
    $city = $route->parameter('city');
    $page = $route->parameter('page');

    $params = [
        'region' => $region,
        'city' => $city,
        'page' => $page
    ];

    return $params;
}

您将获得每条路线的以下结果:

1. 对于example.com/search/myregion/mycity/mypage

{
    "region": "myregion",
    "city": "mycity",
    "page": "mypage"
}

2.对于example.com/search/myregion/mypage

{
    "region": "myregion",
    "city": "mypage",
    "page": null
}

3. 对于example.com/search/mypage

{
    "region": "mypage",
    "city": null,
    "page": null
}

所以这里的问题不在于按顺序或按名称匹配参数,而在于路由定义。要解决此问题,您可以只在查询字符串中添加分页并将其完全删除路由定义,因为如果分页是可选的,那么将分页作为查询字符串参数绝对没有任何问题。所以你的 URL 看起来像这样:

example.com/search/myregion/mycity?page=2

您可以查看Illuminate\Routing\Route 类 API 以查看那里还有哪些其他方法可用。

【讨论】:

  • 这个 $route->getParameter() 正是我正在寻找的,我没有看到它(我想 Laravel 有这样的东西,但我在 Request and Input 而不是 Route 中搜索,但在 Route 中更有意义)。关于路由匹配,我刚刚注意到并且我正在考虑设置两条路由(第一个带有整数所需的'page'参数,第二个没有它,所以它会正确匹配(尽管我必须使用两次规则))或按照您所说的使用查询字符串进行操作。无论如何,这正是我所需要的。谢谢。
猜你喜欢
  • 2015-07-06
  • 2017-01-12
  • 2020-09-01
  • 1970-01-01
  • 2016-07-23
  • 2016-08-18
  • 1970-01-01
  • 2022-01-04
  • 2019-06-30
相关资源
最近更新 更多