首页 文章

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

提问于
浏览
9

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

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

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

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

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

5 回答

  • 2

    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
    

    虽然 resource controller 并不像宁静的控制者那样自以为是 . 它允许您直接从您的控制器创建方法,它们都会自动映射到您的路由:

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

    将自动拥有像 Route::post('/profile', 'Controller@postProfile'); 这样的路由而不在路由上明确定义它,如果你要避免很长的路由文件,那么它将更像是一个帮助器 .

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

  • 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 .

  • 15

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

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

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

  • 1

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

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

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

    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');
    

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

    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
    

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

  • 0

    RESTful Resource Controllers

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

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

    php artisan controller:make PhotoController
    

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

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

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

    Actions Handled By Resource Controller

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

相关问题