2017-01-12 10 views
0

私はLaravel 5.3を使用しています。私は複数のコントローラに、単一のルートで処理したいURLの束を持っています。Laravel 5.3複数のコントローラへの動的ルーティング

GET /admin/foo => [email protected] 
GET /admin/foo/edit/1 => [email protected]($id) 
GET /admin/bar => [email protected] 
GET /admin/bar/edit/1 => [email protected]($id) 
GET /admin/baz => [email protected] 
GET /admin/baz/edit/1 => [email protected]($id) 
etc. 

Iは、コントローラが存在するかどうかを検出できるようにしたい、と(404を投げることができる)デフォルトコントローラ404またはルートを投げていない場合。

以下は私が今までに持っているものですが、私が何をしているのか分かりません。サービスコンテナを使用してコントローラをインスタンス化するべきではありませんか?私はこのような名前空間をハードコーディングする必要があるとは思わない。 idパラメータの扱いは簡単です。おそらく、私はこれらの2つのパターンまたは何かのための2つのルートを持つ必要がありますか?

Route::get('/admin/{entityType}/{action?}/{id?}', function ($entityType, $action = 'index', $id = null) { 

    $controllerClass = 'App\Http\Controllers\\' . ucfirst($entityType) . 'Controller'; 
    $controller = new $controllerClass; 

    $route = app(\Illuminate\Routing\Route::class); 
    $container = app(\Illuminate\Container\Container::class); 
    return (new Illuminate\Routing\ControllerDispatcher($container))->dispatch($route, $controller, $action); 

    abort(404); 
}); 

答えて

0

明示的にすべてのコントローラのルートを定義することをお勧めします。これはメンテナンス可能なアプリを構築する最善の方法です。また

、(それはarchitecure右付き)オプションは、一つのルートを使用することであるつのルートと一つの方法を使用している場合:

Route::get('/admin/{entityType}/{action?}/{id?}', '[email protected]'); 

そして一つのエントリポイント:

public function method($entity, $action = null, $id = null) 
{ 
    // Handle request here. 

https://laravel.com/docs/5.3/routing#parameters-optional-parameters

関連する問題