2017-05-25 5 views
0

この状況で私は非常に混乱しています。私はリソース名と2つのルートを持っています。ルートユーザーの役割Laravel 5.4

Route::resource('product', 'Product\AreaManagerProductController'); 
Route::resource('product', 'Product\SystemAdminProductController'); 

私はコンテキストバインディングを持っているため、1つにする必要があります。

$this->app->when(AreaManagerProductController::class) 
      ->needs(ProductInterface::class) 
      ->give(AreaManagerProductRepository::class); 

      $this->app->when(SystemAdminProductController::class) 
      ->needs(ProductInterface::class) 
      ->give(SystemAdminProductRepository::class); 

コンテキストバインディングはうまくいきますが、私はこのようなルートを変更する必要があります。

Route::resource('product_area_manager', 'Product\AreaManagerProductController'); 
Route::resource('product_system_admin', 'Product\SystemAdminProductController'); 

私はProductControllerと奇妙なソリューションのいくつかの種類を作成しました。

public function index(){ 

     //Create a conditional statement base on user 

     return app('App\Http\Controllers\Product\AreaManagerProductController')->index(); 

    } 

これは動作する可能性がありますが、ミドルウェアをトリガーしない...この状況ではどのようなことがベストプラクティスになる可能性がありますか。 TY

+0

あなたのルート 'Route :: resource( 'product'、 'Product \ AreaManagerProductController');と同じ名前を持つべきではありません。あなたは@NikhilRadadiyaが言ったように、すべてのルート –

+0

のために異なったものを使うべきです。同じ名前の2つのルートを宣言することはできません。あなたができることはコントローラをもう一方のものに拡張することです.. 'Route :: resource( 'product'あなたのAreaManagerProductControllerで行うことができます、 'class AreaManagerProductController extends SystemAdminProductController' – Demonyowh

+0

私はそれが2つの同じ名前のルートリソースで動作しないことを知っています...私は' ProductController'を拡張しようとします。私がそれを作ることができるかどうかを見てください。ありがとう。 – Rbex

答えて

3

あなたは私がルートをグループ化された理由は、冗長性を削減することである、とnamespace Productが、すでに存在しているとして、私はコントローラ名から製品を削除した理由は、あるこの

Route::group(['prefix' => 'product', 'namespace' => 'Product', 'middleware' => '<your middleware>'], function() { 

     Route::resource('area_manager', 'AreaManagerController'); 
     Route::resource('system_admin', 'SystemAdminController'); 
}); 

のようなあなたのルートを持つことができます長いクラス名は必要ありません。

AreaManagerControllerSystemAdminControllerのいくつかの方法にアクセスする場合は、ProductControllerをこれらのコントローラに延長するだけです。

あなたはこれらのコントローラ内部の行動のためのいくつかの特定のmiddlewareを追加したい場合は、私は必要なだけでなく、それを削除した場合、これらのコントローラに影響しますroute groupmiddleware句を追加しています。

希望すると、これが役に立ちます。

+0

これは唯一の方法だと思う...最近私はそれについて考えてきたが、私はまだ他の方法を探している。もし私が見つけられなければ、私はあなたの答えを受け入れるでしょう...助けてくれてありがとう。 – Rbex

+0

ありがとう@Rbex、ちょうどこのパターンで書くのに使用したコードの整理と理解が容易です。 –

+0

'Route :: resource(Auth :: User() - > roles-> first-> name、Auth :: User() - > roles-> first->という名前であればうまくいくでしょう。コントローラ ') '。私はそれを試した...それは動作しません。 – Rbex