web-dev-qa-db-ja.com

Laravel 4RESTfulコントローラーの定義

だから私はv4の時点でLaravelフレームワークに不慣れで、RESTfulコントローラーを作成して使用する方法は何か疑問に思っています。ドキュメントを読んで、私はとの違いについて少し混乱していますRESTfulコントローラーとリソースコントローラー。

ドキュメントに従って、RESTfulコントローラーを定義するときは、_routes.php_で次のことを行うことをお勧めします。

_Route::controller('posts', 'PostController');
_

PostControllerで、メソッドの名前の前に使用するHTTP動詞を付けて、クラスメソッドを定義しますか?例えば:

_class PostController extends \BaseController {
    public function getIndex()
    {
        //
    }
}
_

ただし、次のように_routes.php_ファイルにリソースコントローラーを作成する方法についても概説します。Route:: resource( 'posts'、 'PostController');

そして、_PostController.php_では、HTTP動詞を前に付けずにメソッドを定義します。

_class PostController extends \BaseController {
    public function index()
    {
        //
    }
}
_

2つの違いは何ですか?そして、いつ一方を他方の代わりに使用するのですか、そしてその理由は何ですか?

また、Route::controller('posts', 'PostController');またはRoute::resource('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');
_
16
Iain

このコントローラーを例として取り上げます。

_<?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()を使用するか、手動でルートを作成できます。

編集:

なぜ1つまたは別の理由が本当にデザインと選択の問題であるということはありません。何も使用しない人もいます。 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()を使用して開始します。それ以外の場合は、特定の場合のいずれかの利点について考えてください。

EDIT2:

これは、Phil Sturgeon(PyroCMSおよびPHP-FIG)による、すべてのルートを手動で構築する利点についてのすばらしい記事です。 http://philsturgeon.co.uk/blog/2013/07/beware-the -route-to-evil

@Antonioの答えは良いです。似たような重要なことをもう少し簡潔に言いましょう。 routers.php:

Route::resource('users', 'UserController');

Resourceメソッドを使用すると、LaravelはCRUD機能を想定し、インデックス、作成、保存、表示、破棄など、6つの事前に作成されたCRUDメソッドのみを検索します。 「そこで作成する他の新しいメソッド。

Route::controller('info', 'InfoController');

コントローラメソッドを使用すると、カスタムメソッド/ページを作成できます。 Laravelメソッド/ページ名の前にHTTP動詞を付けると、それらを探します。XxxxController.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');
    }

}
6
Andrew Koper