Laravel-Route :: resource対Route :: controller


138

私はLaravelのウェブサイト、スタックオーバーフロー上のドキュメントを読んで、とGoogleが、まだの違いを理解していないRoute::resourceとしますRoute::controller

答えの1つは、Route :: resourceはクラッド用であると述べています。ただし、Route :: controllerを使用すると、Route :: resourceと同じことを実行でき、必要なアクションのみを指定できます。

彼らは兄弟のように見えます:

Route::controller('post','PostController');
Route::resource('post','PostController');

使用するものをどのように選択できますか?良い習慣とは何ですか?


12
Laravel 5.2ユーザー向けの注意事項ですが、暗黙のコントローラーは非推奨です。
Roy

回答:


281

RESTfulリソースコントローラー

RESTfulなリソースコントローラあなたも名前彼らのためにいくつかのデフォルトルートを設定します。

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

次の名前付きルートを提供します。

Verb          Path                        Action  Route Name
GET           /users                      index   users.index
GET           /users/create               create  users.create
POST          /users                      store   users.store
GET           /users/{user}               show    users.show
GET           /users/{user}/edit          edit    users.edit
PUT|PATCH     /users/{user}               update  users.update
DELETE        /users/{user}               destroy users.destroy

そして、あなたはあなたのコントローラをこのようなものに設定します(アクション=メソッド)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

次のように、どのアクションを含めるか、または除外するかを選択することもできます。

Route::resource('users', 'UsersController', [
    'only' => ['index', 'show']
]);

Route::resource('monkeys', 'MonkeysController', [
    'except' => ['edit', 'create']
]);

RESTfulリソースコントローラーのドキュメント


暗黙のコントローラー

暗黙的なコントローラは、より柔軟です。HTTPリクエストのタイプと名前に基づいてコントローラーメソッドにルーティングされます。ただし、ルート名が定義されていないため、同じルートのすべてのサブフォルダーをキャッチします。

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

ある種のRESTfulな命名スキームを使用してコントローラーをセットアップすることになります。

class UserController extends BaseController {

    public function getIndex()
    {
        // GET request to index
    }

    public function getShow($id)
    {
        // get request to 'users/show/{id}'
    }

    public function postStore()
    {
        // POST request to 'users/store'
    }

}

Implicit Controllerのドキュメント


好みに応じて、必要なものを使用することをお勧めします。個人的にはImplicitコントローラーは好きではありませんphp artisan routes。混乱する可能性があり、名前を提供しないため、を使用するときに混乱する可能性があるためです。私は通常、明示的なルートと組み合わせてRESTfulリソースコントローラーを使用します。


1
複数のリソースルート(おそらくインデックス、表示)を使用する場合は、静的ルートRoute :: get(...)を使用しないのはなぜですか?array( 'only' => array( 'index'、 'show')を使用するよりも最悪ではないと思います。そして、「user / 123」、getIndex()のようなものをリクエストしたときにRESTFullコントローラに使用されるメソッドは、 'user /'がuser / 123でエラーNotFoundHttpExceptionが発生する(別の名前getViewなどを試し、Controller @
getView

誰かが「resource.edit」の目的を明確にできますか?これはGETメソッドなので、 'resource.show'による限られた情報だけでなく、リソースに関する完全な情報をすべて満載していると思いますか?
アンソニー

1
@Anthony- resource.edit基本的に、既存のリソースを編集するためのフォームである編集ビューを表示します。
ライアンウィンチェスター2014

@fungku興味深いですね。resource.editは実際にはJSONではなくHTMLを返すということですか。
アンソニー

2
@Anthony一般的に(そして私が知る限り)そうです。resource.editそして、resource.createHTMLフォームとビューをレンダリング... UIのために、一般的です。これらのフォームはresource.updateresource.storeそれぞれPUT / POSTします。そうしない場合は、それらを無視して、コントローラーのedit()メソッドとcreate()メソッドを削除できます。
ライアンウィンチェスター2014

3

ルートコントローラーメソッドでは、ルートを1つだけ定義する必要があります。getまたはpostメソッドでは、ルートを個別に定義する必要があります。

そして、resourcesメソッドを使用して、さまざまなRestfulアクションを処理する複数のルートを作成します。

ここにこれに関するLaravelのドキュメントがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.