Laravel 4定义RESTful控制器

Laravel 4定义RESTful控制器,rest,laravel,laravel-4,laravel-routing,Rest,Laravel,Laravel 4,Laravel Routing,因此,我从v4开始就不熟悉Laravel框架,不知道创建和使用RESTful控制器的方法是什么。通过阅读文档,我对RESTful控制器和资源控制器之间的区别感到有点困惑 根据文档定义RESTful控制器时,建议在routes.php中执行以下操作: Route::controller('posts', 'PostController'); 在PostController中,我们是否通过在方法名称前面加上我们希望使用的HTTP动词来定义类方法?例如: class PostController e

因此,我从v4开始就不熟悉Laravel框架,不知道创建和使用RESTful控制器的方法是什么。通过阅读文档,我对RESTful控制器和资源控制器之间的区别感到有点困惑

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

Route::controller('posts', 'PostController');
PostController
中,我们是否通过在方法名称前面加上我们希望使用的HTTP动词来定义类方法?例如:

class PostController extends \BaseController {
    public function getIndex()
    {
        //
    }
}
但是,它还概述了在
routes.php
文件中创建资源控制器的方法,如下所示: 路由::资源('posts','PostController')

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

class PostController extends \BaseController {
    public function index()
    {
        //
    }
}
这两者的区别是什么?我们什么时候用一个代替另一个,为什么

另外,我们应该使用
Route::controller('posts','PostController')
路由::资源('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');

以该控制器为例:

<?php

class TestController extends BaseController {

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

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

}
执行

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()或手动构建路由

编辑:

没有一个或另一个真正的原因,只是设计和选择的问题。有些人永远不会使用它们。只是hat
Route::resource()
遵循Rails的路由方式:

使用
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)的优秀文章,介绍了手动构建所有路线的好处:。

@Antonio的答案很好。让我简明扼要地说一些类似和重要的话。在routes.php中:

Route::resource('users', 'UserController');
使用resource方法使Laravel假设CRUD功能,它只查找其六个预先制作的CRUD方法:索引、创建、存储、显示、销毁等。它不会“看到”您在那里创建的任何其他新方法

Route::controller('info', 'InfoController');
使用控制器方法可以创建自定义方法/页面。在方法/页面名称前面加上HTTP谓词时,Laravel会查找它们。在xxcontroller.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');
    }

}

后者,Route::resource,如文档所示-除非您需要更多控制。:)所以使用
Route::controller('posts','PostController')不应用于创建RESTful控制器?我们也不应该在控制器方法前面加上适当的HTTP谓词?我意识到最后一个问题可能不适合这种形式,因为它是主观的。我不太确定我是否理解你的答案。如果两者达到相同的效果,为什么我要使用
Route::controller
而不是
Route::resource
<代码>路由::控制器
设置RESTful控制器似乎是一个更复杂的过程,因为它需要打破惯例并在控制器方法前面加上HTTP谓词。是否有任何理由在
Route::resource
上使用它?如果我使用
Route::resource
我就不必有用于索引、创建、存储、显示、编辑、更新和销毁的控制器方法,是吗?添加或删除方法将反映在可用的路由中?好的,据我所知,
Route::controller
检查控制器并根据找到的方法生成路由,而
Route::resource
生成可用路由的预定义列表。那么,我的问题是,如果我使用
Route::resource('posts','PostController')
,并在
PostController.php
中添加或删除方法,Laravel会检查控制器并创建或删除路由吗?假设我将一个方法
archive()
添加到
PostsController.php
-Laravel会将
/posts/archive/
添加到我的可用路由中,还是必须通过
Route::get()
手动指定?在routes.php中,这也是一篇优秀的文章,我想我可能会手动定义路由,而不是依赖
Route::controller
Route::resource
。我可以使用
php artisan controller:make{x}
生成脚手架,并在routes.php文件中相应地映射到它。这似乎是一种良好的做法?Laravel只会检查“Route::controller”上的控制器方法。“Route::resource”创建的所有路由都在router类中预定义。它不会检查控制器以查找新路由。要改变这一点,您需要扩展该类并用自己的路由器替换Laravel路由器
artisan controller:make
是一个很好的生成器,有时您可能需要删除一些样板代码,但当您需要一个完整的CRUD控制器时,它会有很大帮助,或者您可以使用这些选项
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');
    }

}