【问题标题】:Route::controller with optional parameters in Laravel 4Laravel 4 中带有可选参数的 Route::controller
【发布时间】:2014-06-08 16:41:26
【问题描述】:

我刚接触 Laravel,但我立即爱上了它。作为一个不太有经验的 php 开发人员,我确实找到了官方文档,虽然内容非常广泛,但使用起来有些复杂,并且找到了我需要的一切。

我的问题是关于路由组件。正如文档所述,您可以使用 Route::controller 方法将路由分配给控制器。因此,如果我想要一个用于所有 /blog/ 路由的博客控制器,我会这样分配它:

Route::controller('blog', 'BlogController');

那么,如果我想访问我所有的博客文章,我可以通过 www.foo.com/blog 或 www.foo.com/blog/index 访问 getIndex 方法

但假设我希望能够通过 getCategory 方法显示类别。我的 url 看起来像 www.foo.com/blog/category,例如,如果我想通过 slug 从数据库中获取新闻类别,我想使用:www.foo.com/blog/category/news 作为 URI。

我现在的问题是,如何将 slug 传递给 url 并在 getCategory 方法中访问它?我需要通过Route::get('blog/category/{slug}', 'BlogController@getCategory') 指定它还是有办法使用Route::controller('blog', 'BlogController') 并在getCategory 方法中从URL 发送和访问参数?

我已经尝试通过谷歌和官方文档找到它,但我找不到这个问题的清晰答案......

【问题讨论】:

    标签: php laravel-4


    【解决方案1】:

    使用Route::controller('blog', 'BlogController'); 允许您使用 REST 命名约定定义单个路由来处理控制器中的每个操作。然后您必须向控制器添加方法,并以它们响应的 HTTP 动词为前缀。这意味着如果您有一个名为 getIndex() 的方法,它将在对 url“yoursite.com/blog”的 GET 请求时执行。 要处理对同一 url 的 POST 请求,请为其他 http 动词 PUT、PATCH 和 DELETE 添加一个前缀为 post(ex: postComment()) 等的方法。

    我认为您想要更多定制的东西,因此您可以使用资源控制器:

    Route::resource('blog', 'BlogController');

    这将围绕博客资源生成一些 RESTful 路由,在您的项目文件夹中运行 php artisan routes 以查看生成的路由,应该是这样的:

    Verb      Path                       Action     Route Name
    GET       /blog                      index      blog.index
    GET       /blog/create               create     blog.create
    POST      /blog                      store      blog.store
    GET       /blog/{blog}               show       blog.show
    GET       /blog/{blog}/edit          edit       blog.edit
    PUT/PATCH /blog/{blog}               update     blog.update
    DELETE    /blog/{blog}               destroy    blog.destroy
    

    action 列中是您应该在控制器中具有的功能。 如果你想定义更多的路由,你可以简单地在 routes.php 文件中使用Route::get 或Route::post 来完成

    我希望这会让你更清楚,享受 Laravel 的路由吧!!!

    【讨论】:

      【解决方案2】:

      您可以简单地向您的 getCategory 方法添加参数:

      public function getCategory($category) {
          die($category);
      }
      

      如果你在参数列表中将它初始化为null,它就变成了可选的。或者,您始终可以从 Input 对象中提取参数,但它们需要以查询字符串格式传递:

      $category = Input::get('category');
      

      话虽如此,我还是要告诫不要使用 Controller 路由。它很方便,并且模仿了传统的 MVC 框架,但我相信它已被计划弃用——老实说,你错过了一些非常灵活的功能。

      【讨论】:

      • 谢谢,这正是我要找的!但是如果你说它可能会被弃用,你认为最好的选择是什么?我应该独立定义每条路由而不是使用 Route::controller 方法吗?
      • 是的,没错。这听起来很乏味,我想是的,但它变得很例行公事。资源控制器始终是自动化程度更高的选项,但我强烈建议使用定义明确的路由,并附上名称('as' 参数),这样您就可以更改 url 映射、控制器、参数等,而无需真正触及任何你的 html 链接。
      猜你喜欢
      • 2015-01-09
      • 2014-11-17
      • 2014-11-13
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2013-10-13
      相关资源
      最近更新 更多