以这个控制器为例:
<?php
class TestController extends BaseController {
public function getIndex()
{
echo "a";
}
public function postSecond($a)
{
echo "b";
}
}
在您的路线中,如果您有
Route::controller('tests', 'TestController');
并执行
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() 或手动构建路由。
编辑:
没有真正的为什么一个或为什么另一个,只是设计和选择的问题。有些人永远不会使用它们。它只是Route::resource()
遵循 Rails 的路由方式:http: //guides.rubyonrails.org/routing.html。
使用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),关于手动构建所有路线的好处:http: //philsturgeon.co.uk/blog/2013/07/beware-the-route-to -邪恶。