Laravel-4:Laravel中RESTful控制器和资源控制器之间的区别

时间:2014-04-08 09:44:29

标签: laravel laravel-4

有人可以解释一下Laravel中RESTful控制器和资源控制器之间的区别吗?我也有一些问题 -

  

何时应该使用RESTful控制器和何时使用资源控制器?

  • RESTful控制器和资源控制器的Controller操作是否有任何命名约定?

  • 如果我使用RESTful控制器,我该如何为控制器定义路由?

  • 构建控制器方法最好的API?

5 个答案:

答案 0 :(得分:15)

Laravel资源控制器定义为Route::controller('users', 'UserController');,而Restful Controllers定义为Route::resource('photo', 'PhotoController');

restful controller 遵循宁静资源的标准蓝图,该资源主要包括:

GET         /resource                    index         resource.index
GET         /resource/create             create        resource.create
POST        /resource                    store         resource.store
GET         /resource/{resource}         show          resource.show
GET         /resource/{resource}/edit    edit          resource.edit
PUT/PATCH   /resource/{resource}         update        resource.update
DELETE      /resource/{resource}         destroy       resource.destroy

虽然资源控制器与固定控制器不同。它允许您直接从您的控制器创建方法,它们都会自动映射到您的路线:

public function getIndex()
{
    // Route::get('/', 'Controller@getIndex');
}

public function postProfile()
{
    // Route::post('/profile', 'Controller@postProfile');
}

如果要避免使用非常长的路径文件,将自动拥有像Route::post('/profile', 'Controller@postProfile');这样的路由而不在路由上明确定义它,更多的是帮助器。

执行php artisan routes会显示所有路线。您可以测试输出并使用该命令查看自动生成的路由。

答案 1 :(得分:4)

它们是不同的概念。在laravel中,资源控制器定义给定命名资源的所有默认路由,以跟随REST principles

因此,当您在routes.php中定义资源时,如:

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

Laravel唯一能做的就是为你定义这条路线:

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

并期望您在控制器上定义这些方法。您也可以只使用/ except子句删除不需要的路由:

Route::resource('user', 'UserController', ['except' => ['destroy']]);

有关Laravel's documentation的详情。

答案 2 :(得分:2)

这只是路由声明的区别。而不是使用其中之一,手动定义所有路线。

Route::get(...);
Route::post(...);
Route::put(...);
Route::delete(...);
Route::patch(...);

它使您的路线文件具有权威性,易于理解和减少错误。

答案 3 :(得分:1)

该文档当前显示RESTful和Resource控制器引用相同的内容。

Route::resource('resource', 'ResourceController');

它定义以下 http请求谓词映射到URI,控制器操作和路由的路由。这允许您使用预定义的路由名称连接到预定义的控制器操作,并将resource_id映射到{resource},如图所示。

Verb      URI                                  Action  Route Name
GET       /resource/index.blade.php             index   resource
GET       /resource/create.blade.php            create  resource.create
POST      /resource                             store   resource.store
GET       /resource/{resource}/show.blade.php   show    resource.show
GET       /resource/{resource}/edit.blade.php   edit    resource.edit
PUT/PATCH                                       update  resource.update
DELETE                                          destroy resource.destroy

术语隐式控制器似乎是指定

的使用的术语
Route::controller('resource', 'ResourceController');

将神奇地将所有路由连接到ResourceController,以便在控制器中使用的函数名中添加http请求谓词(get / post)作为前缀。这会将任何URI映射到前面的(get / put)控制器操作(函数),但不会将resource_id映射到{resource}或路由名称。

class UserController extends BaseController {

    public function getIndex()
    {
        //
    }

    public function postProfile()
    {
        //
    }

    public function anyLogin()
    {
        //
    }
}

映射到

Verb      URI                  Action           Route Name
GET       /index               getIndex         
POST      /profile             postProfile      
GET       /login               anyLogin         
POST      /login               anyLogin         
DELETE    /login               anyLogin         

由您来决定使用哪种方法进行路由。关于什么是有用的,如果路由甚至值得它引起的混乱,也存在一些争论。

答案 4 :(得分:0)

RESTful资源控制器

资源控制器可以更轻松地围绕资源构建RESTful控制器。例如,您可能希望创建一个管理"照片"由您的应用程序存储。使用控制器:通过Artisan CLI和Route :: resource方法生成命令,我们可以快速创建这样的控制器。

要通过命令行创建控制器,请执行以下命令:

php artisan controller:make PhotoController

现在我们可以向控制器注册资源丰富的路由:

Route::resource('photo', 'PhotoController');

此单一路由声明创建多个路由来处理照片资源上的各种RESTful操作。同样,生成的控制器已经为每个操作都有了存根方法,并通过注释通知您处理了哪些URI和动词。

资源控制器处理的操作

http://laravel.com/docs/5.0/controllers#restful-resource-controllers