Laravel 4定义了RESTful控制器

Iai*_*ain 16 rest laravel laravel-4 laravel-routing

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

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

Route::controller('posts', 'PostController');
Run Code Online (Sandbox Code Playgroud)

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

class PostController extends \BaseController {
    public function getIndex()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

class PostController extends \BaseController {
    public function index()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

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

此外,我们应该使用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');
Run Code Online (Sandbox Code Playgroud)

Ant*_*iro 35

以此控制器为例:

<?php

class TestController extends BaseController {

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

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

}
Run Code Online (Sandbox Code Playgroud)

在你的路线,如果你有

Route::controller('tests', 'TestController');
Run Code Online (Sandbox Code Playgroud)

并执行

php artisan routes
Run Code Online (Sandbox Code Playgroud)

你有:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| 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      |                |               |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
Run Code Online (Sandbox Code Playgroud)

Laravel检查控制器并根据它找到的方法自动生成路径.

但如果你这样做

Route::resource('tests', 'TestController');
Run Code Online (Sandbox Code Playgroud)

你会得到这条路线:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| 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            |                |               |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
Run Code Online (Sandbox Code Playgroud)

没有猜测,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')));
Run Code Online (Sandbox Code Playgroud)

您的路线列表将仅显示索引和显示操作.

此外,如果您需要一些其他路线,使用Route::resource()您必须手动构建它们或使用一些魔法使它们自动为您所有的资源路线.使用Route::controller()一切都是自动的,每次添加新方法时,都会为您创建新路线.

同样,如果您要构建CRUD控制器,请先使用Route::resource().否则,请考虑您的具体情况中的一方或另一方的好处.

EDIT2:

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

  • 另一个编辑,只是添加一篇文章的链接. (3认同)

And*_*per 6

@Antonio的答案很好.让我更简洁地说一些类似和重要的内容.在routes.php中:

Route::resource('users', 'UserController');
Run Code Online (Sandbox Code Playgroud)

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

Route::controller('info', 'InfoController');
Run Code Online (Sandbox Code Playgroud)

使用控制器方法可以创建自定义方法/页面.当您使用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');
    }

}
Run Code Online (Sandbox Code Playgroud)