Laravel 4定义RESTful控制器
因此,我从v4开始就不熟悉Laravel框架,不知道创建和使用RESTful控制器的方法是什么。通过阅读文档,我对RESTful控制器和资源控制器之间的区别感到有点困惑 根据文档定义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
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()或手动构建路由
编辑:
没有一个或另一个真正的原因,只是设计和选择的问题。有些人永远不会使用它们。只是hatRoute::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');
}
}