So I'm new to the Laravel framework as of v4 and wondering what is the way to create and use RESTful controllers. Reading through the documentation, I'm a bit confused as to the difference between RESTful controllers and Resource controllers.

根据文档,在定义REST风格的控制器时,建议在routes.php中执行以下操作:

Route::controller('posts', 'PostController');

PostController中,我们是否通过在方法名称前加上我们想使用的HTTP动词来定义类方法?例如:

class PostController extends \BaseController {
    public function getIndex()
    {
        //
    }
}

但是,它还概述了在routes.php文件中创建资源控制器的方法,如下所示:

And in PostController.php we define methods without prefixing it with the HTTP verb.

class PostController extends \BaseController {
    public function index()
    {
        //
    }
}

What is the difference between the two? And when do we use one instead of the other, and why?

另外,我们应该使用Route::controller('posts', 'PostController');Route::resource('posts', 'PostController');将路由传递给控制器,还是应该手动定义每条路由,如下所示:

Route::get('/users', 'UserController@index');
Route::get('/users/create', 'UserController@create');
Route::post('/users', 'UserController@store');
Route::get('/users/{id}', 'UserController@show');
Route::get('/users{id}/edit', 'UserController@edit');
Route::put('/users', 'UserController@update');
Route::delete('/users', 'UserController@destroy');

推荐答案

以此控制器为例:

<?php

class TestController extends BaseController {

    public function getIndex()
    {
        echo "a";
    }

    public function postSecond($a)
    {
        echo "b";
    }

}

In your routes, if you have

Route::controller('tests', 'TestController');

And execute

php artisan routes

您将拥有:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| Domain | URI                                        | Name                   | Action                            | Before Filters | After Filters |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
|        | GET /tests/index/{v1}/{v2}/{v3}/{v4}/{v5}  |                        | TestController@getIndex           |                |               |
|        | GET /tests                                 |                        | TestController@getIndex           |                |               |
|        | POST /tests                                | tests.store            | TestController@store              |                |               |
|        | GET /tests/{_missing}                      |                        | TestController@missingMethod      |                |               |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+

Laravel inspects the controller and generates routes based on what methods it finds, automatically.

但如果你这么做了

Route::resource('tests', 'TestController');

You'll get this route listing:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| Domain | URI                                        | Name                   | Action                            | Before Filters | After Filters |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
|        | GET /tests                                 |                        | Closure                           |                |               |
|        | GET /tests                                 | tests.index            | TestController@index              |                |               |
|        | GET /tests/create                          | tests.create           | TestController@create             |                |               |
|        | POST /tests                                | tests.store            | TestController@store              |                |               |
|        | GET /tests/{tests}                         | tests.show             | TestController@show               |                |               |
|        | GET /tests/{tests}/edit                    | tests.edit             | TestController@edit               |                |               |
|        | PUT /tests/{tests}                         | tests.update           | TestController@update             |                |               |
|        | PATCH /tests/{tests}                       |                        | TestController@update             |                |               |
|        | DELETE /tests/{tests}                      | tests.destroy          | TestController@destroy            |                |               |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+

不用猜测,Laravel使用预定义的CRUD路由列表,您可以删除其中一些路由,但它不会判断控制器以为您的方法构建路由.

You decide what's best for you. But, usually, if your controller is a CRUD one, Route::resource() is a good start, otherwhise you can use Route::controller() or build your routes manually.

编辑:

没有真正为什么一个或为什么另一个,只是一个设计和 Select 的问题.有些人永远不会使用它们中的任何一个.只是HAT Route::resource()遵循Rails的路由方式:http://guides.rubyonrails.org/routing.html.

使用Route::resource(),您不需要创建所有这些方法,但最终会得到一个毫无意义的路由列表,因为默认情况下,Laravel总是创建所有这些路由,除非您:

Route::resource('photo', 'PhotoController',
                array('only' => array('index', 'show')));

而您的路由列表将只显示索引和显示操作.

此外,如果您需要一些其他路由,使用Route::resource(),您将不得不手动构建它们或使用一些魔术,使它们自动为您所有的足智多谋的路由.使用Route::controller()一切都是自动的,每次您添加新方法时,都会为您创建一条新路由.

同样,如果要构建CRUD控制器,请从使用Route::resource()开始.否则,在你的特殊情况下,考虑一下其中一个的好处.

EDIT2:

这是来自Phil Sturjo(PyroCMS和PHP-FIG)的一篇很棒的文章,它讲述了手动构建所有路由的好处:http://philsturgeon.co.uk/blog/2013/07/beware-the-route-to-evil.

Laravel相关问答推荐

在GitHub操作中缺少PHPStan和PHPMD输出,但在本地存在

在Laravel Sail Docker环境中的PHPMyAdmin中出现`Out of Memory‘错误

未找到 apiResource 404 中的变量

如何在 Laravel 中填充以后执行的条件

Laravel Eloquent 查找日期超过 2 天的行

如何判断用户Electron邮件是否已存在

在laravel中将数据插入数据透视表

使用 Eloquent (Laravel) 在 Group By 之前排序

Laravel 5 文件下载:stream() 或 download()

Laravel 5 - 在控制器文件中为多个路由定义中间件

413请求实体在laravel homestead for windows中太大的nginx服务器

干预图像:直接从带有原始文件名和分机的网址保存图像?

Laravel - DecryptException:'MAC 无效'

如何使用 Laravel 测试授权重定向?

Laravel 5.4 - Mix - 如何运行浏览器实时重新加载

在 Laravel 中结合 AND/OR Eloquent的查询

如何在 vs 代码中自动导入 laravel 类

在laravel中删除确认

Laravel:如何在 PhpUnit 上启用堆栈跟踪错误

Laravel如何仅响应没有正文消息的204代码状态