16

したがって、私は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');
4

2 に答える 2

35

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

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

また、ルートのリストには 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 -悪

于 2013-08-23T12:30:40.117 に答える
6

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

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

resource メソッドを使用すると、Laravel は CRUD 機能を想定し、6 つの既製の CRUD メソッド (index、create、store、show、destroy など) のみを検索します。そこで作成した他の新しいメソッドは「認識」されません。 .

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

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

}
于 2014-01-04T03:30:30.627 に答える