2015-12-29 7 views
5

私は、この構造を使用する必要があります...スリム3フレームワーク - 私は自分のAPIにルートグループを使用すべきですか?

require 'vendor/autoload.php'; 
$app = new \Slim\App; 

$app->get('/books', 'getBooks'); 
$app->get('/books/{id}', 'getBook'); 

$app->run(); 

function getBooks() { 
    // Return list of books 
} 

function getBook($id) { 
    // Return a single book 
} 

それとも、この「ルートグループ」1?

require 'vendor/autoload.php'; 
$app = new \Slim\App; 

$app->group('/books', function() use ($app) { 
    $app->get('', function ($req, $res) { 
     // Return list of books 
    }); 

    $app->get('/{id:\d+}', function ($req, $res, $args) { 
     // Return a single book 
    }); 
}); 

$app->run(); 

もっと良い方法はありますか?前者ははるかにクリーンなようです。私は比較的新しいので、私は賛否両論を知らない。

+0

実際に、私には、後者は、はるかに優れた構造化されたに見えます。どちらもうまくいけば、あなたが好きなやり方でやりたいと思うかもしれません.SOは意見の質問にはあまり適していません。 – nonchip

+0

@nonchipそれは問題です。私はそれが意見に下がっているのか、適切な条約があるのか​​はわかりません。 – Ivan

+0

フレームワークのためのドキュメントやサンプルプロジェクトを見てください。どんなことでもより一貫して使用されていると思われるものが、この大会になる可能性があります。親指のルールとして、最初の例は、物事を短くしておくといいですが(=簡単)、もう1つは(ルータの最適化とプログラマーの観点から)管理する方が良いようですあなたが本でたくさんのものをやろうとするならば。 – nonchip

答えて

8

は一般的に、あなたは目に見えて、コード内の関係を見ることができるように、同様のリソースやコンテンツを整理するルートグループを使用します。ルートグループは、特定のグループにミドルウェアなどの特別な条件を設定する必要がある場合にも役立ちます。たとえば、Webサイトに管理者セクションがあり、コントローラにアクセスする前にユーザーが実際に管理者であることを確認したい場合があります。

$app->get('panel/admin', 'Admin/DashboardController:index')->add($adminAuth); 
$app->get('panel/admin/users', 'Admin/UserController:index')->add($adminAuth); 
$app->post('panel/admin/users', 'Admin/UserController:create')->add($adminAuth); 

明らかに、類似の特性を共有しているため、これらのルートをグループ化することは明らかです。将来(ミドルウェアのタイプのような)これらの特性について何かを変更する必要がある場合は、一度だけ行う必要があります。

$app->group('/panel', function() use ($app) { 
    $app->group('/admin', function() use ($app) { 
     $app->get('', 'Admin/DashboardController:index'); 
     $app->get('/users', 'Admin/UserController:index'); 
     $app->post('/users', 'Admin/UserController:create'); 

    })->add($adminAuth); 
})->add($userAuth); 

あなたは今まであなたが定期的にユーザーが使用できるパネルの新機能を展開したいと言うことができます、その特定のURIのユースケースを拡張したい場合にも便利です。

$app->group('/panel', function() use ($app) { 

    $app->group('/admin', function() use ($app) { 

     $app->get('', 'Admin/DashboardController:index'); 
     $app->get('/users', 'Admin/UserController:index'); 
     $app->post('/users', 'Admin/UserController:create'); 

    })->add($adminAuth); 


    $app->get('', 'DashboardController:index'); 

})->add($userAuth); 

それが重要なの多大ではありませんが、可能性として組織として、すべてのコードをレイアウトするだけで良い習慣です、とルートグループは、あなたがこれを行うことができます。

+1

くそー、それは良い答えです。ありがとう! – Ivan

+0

グループクロージャの内部では、 '$ app'の代わりに' $ this'が使われています。 Slimは、コンテナーインスタンスとのルートコールバックバインドの場合と同様に、クロージャーをアプリケーションインスタンスにバインドします。 '$ this'はSlim \ Appのインスタンスにバインドされています。' $ this'はSlim \ Containerのインスタンスにバインドされています [Slim Documentation:Route Groups](https:///www.slimframework.com/docs/objects/router.html#route-groups) – red

+1

は真@redが、IDEが簡単に$これよりも($アプリ)を使用して理解しています。私は$ thisを使うのではなく、上記の方法ですべての自分のアプリに行きます。 – Sojimaxi

関連する問題