有人可以解释一下Laravel中RESTful控制器和资源控制器之间的区别吗?我也有一些问题 -
何时应该使用RESTful控制器和何时使用资源控制器?
RESTful控制器和资源控制器的Controller操作是否有任何命名约定?
如果我使用RESTful控制器,我该如何为控制器定义路由?
构建控制器方法最好的API?
答案 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