具有Laravel 4中可选参数的Route :: controller

时间:2014-04-23 17:25:13

标签: php laravel-4

我只是Laravel的新手,但我立刻爱上了它。作为一个不那么经验丰富的php开发人员,我确实找到了官方文档,虽然非常广泛,使用起来有点复杂,并且找到了我需要的一切。

我的问题是路由组件。如文档所述,您可以使用Route::controller方法将路径分配给控制器。因此,如果我想为所有/blog/路由设置一个Blog控制器,我会像这样分配它:

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

那么,如果我想访问我的所有博文,请按www.foo.com/blogwww.foo.com/blog/index

访问getIndex方法

但是,我想说我希望能够通过getCategory方法显示类别。我的网址看起来像www.foo.com/blog/category,例如,如果我想通过slug从DB获取新闻类别,我想使用:www.foo.com/blog/category/news作为URI。

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

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

2 个答案:

答案 0 :(得分:2)

您只需向getCategory方法添加参数:

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

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

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

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

答案 1 :(得分:1)

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

我认为您需要更多自定义内容,因此您可以使用资源控制器:

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
操作列中的

是控制器中应具有的功能。 如果要定义更多路线,可以使用routes.php文件中的Route::getRoute::post进行操作

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