16

所以我是 Laravel 框架 v4 的新手,想知道创建和使用 RESTful 控制器的方法是什么。通读文档,我对 RESTful 控制器和资源控制器之间的区别感到有些困惑。

在定义 RESTful 控制器时,根据文档,它建议在以下内容中执行以下操作routes.php

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

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

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

但是,它还概述了一种在routes.php文件中创建资源控制器的方法,如下所示: Route::resource('posts', 'PostController');

PostController.php我们定义的方法中,不使用 HTTP 动词作为前缀。

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

两者有什么区别?我们什么时候使用一个而不是另一个,为什么?

此外,我们应该使用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');
4

2 回答 2

35

以这个控制器为例:

<?php

class TestController extends BaseController {

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

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

}

在您的路线中,如果您有

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

并执行

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 检查控制器并根据它找到的方法自动生成路由。

但如果你这样做

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

您将获得此路线列表:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| 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 路由列表,您可以删除其中一些路由,但它不会检查您的控制器来为您的方法构建路由。

你决定什么是最适合你的。但是,通常,如果您的控制器是 CRUD 控制器,Route::resource() 是一个好的开始,否则您可以使用 Route::controller() 或手动构建路由。

编辑:

没有真正的为什么一个或为什么另一个,只是设计和选择的问题。有些人永远不会使用它们。它只是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(). 否则,请考虑在您的特定情况下一个或另一个的好处。

编辑2:

这是一篇很棒的文章,来自 Phil Sturgeon(PyroCMS 和 PHP-FIG),关于手动构建所有路线的好处:http: //philsturgeon.co.uk/blog/2013/07/beware-the-route-to -邪恶

于 2013-08-23T12:30:40.117 回答
6

@Antonio 的回答很好。让我更简洁地说一些类似和重要的事情。在 routes.php 中:

Route::resource('users', 'UserController');

使用资源方法使 Laravel 承担 CRUD 功能,它只查找它的六个预制 CRUD 方法:索引、创建、存储、显示、销毁等。它不会“看到”你在那里创建的任何其他新方法.

Route::controller('info', 'InfoController');

使用控制器方法允许您创建自定义方法/页面。当您在方法/页面名称前加上 HTTP 动词时,Laravel 会查找它们。在您的 XxxxController.php 中:

class InfoController extends \BaseController {

    public function getFeatures()
    {
        return View::make('info.features');
    }

    public function getContactUs()
    {
        return View::make('info.contact-us');
    }

    public function getPricing()
    {
        return View::make('info.pricing');
    }

}
于 2014-01-04T03:30:30.627 回答