2016-12-02 19 views
1

私は現在LaravelでバニラPHP-Appを再構築していますが、私は以下の問題があります。 私は、単語のカテゴリ(名詞、動詞、副詞、...)を表す複数のデータベーステーブルを持っています。テーブルごとに、私は別々のモデル、route :: resourceと別個のリソースコントローラを作成しました。たとえば、次のようにLaravel:複数のモデル用に1つのコントローラ

NomenController.php基本的にモデルクラス以外は同じです

public function show($id) 
{ 
    $vocab = Nomen::find($id); 
    return view('glossarium.vocab_update', compact('vocab')); 
} 

VerbController.php

public function show($id) 
{ 
    $vocab = Verb::find($id); 
    return view('glossarium.vocab_update', compact('vocab')); 
} 

...。

モデルごとに別々のコントローラを作成する必要はありませんが、まったく同じです。これを解決する最もシンプルでエレガントな方法は何でしょうか? 私はちょうどVocabController.phpを作成し、同様にモデル名のためのパラメータを追加する必要がありますがあれば、私は疑問に思う

Route::resource('/vocab/{category}', 'VocabController'); 

、その後

public function __construct ($category) { 
    if ($category == 'nomen') { 
     $this->vocab = App\Nomen; 
    } 
    else if ($category == 'verb') { 
     $this->vocab = App\Verb; 
    } 
} 

のように、このコントローラでコンストラクタメソッドを追加それを行う簡単な方法。ルートモデルバインドでこれをどうしようもできますか?事前

+0

あなたは動作する方法を提案しましたが、名詞/動詞などが継承する "Vocab"モデルを作成することをお勧めします。次に、あなたのvocabコントローラが必要です。 – Samsquanch

答えて

1

おかげで私はそれが唯一のコントローラ、方法nomenと例えばVocabControllerverbと何でもしたいを作成するための最も単純な方法だと思います。

ルート:

Route::get('/vocab/nomen/{nomen}', '[email protected]'); 
Route::get('/vocab/verb/{verb}', '[email protected]'); 

とモデルバインディング:

Route::model('nomen', 'App\Nomen'); 
Route::model('verb', 'App\Varb'); 

を次に、あなたの方法は、そのように見えるshoud:

public function item($item) 
{ 
    return view('glossarium.vocab_update', $item); 
} 

$itemが既にフェッチモデルであることを、覚えておいてくださいデータベースから。単にのApp \トレイト、このようなtraitを作成

+0

面白そうですね。私は、各データベーステーブルのコントローラメソッドを持っている場合、私は次に、CRUD-Operationsのために、public function verb_create、.... public function verb_delete、nomen_create、nomen_deleteなどの別々のメソッドを必要としますか?または、各リクエスト(PUT、DELETEなど)ごとに異なるルートを作成するだけですか? – Bene

+1

別ルートが良いと思います – piotr

2

(あなたはそれを何に名前を付けることができます...しかし鉱山に行ってはいけない...私は...そのかなりラメ感じる:P)

use App\Traits\CommonControllerFunctions; 

class NomenController { 

    use CommonControllerFunctions; 

    protected $model = Nomen::class; 

} 

namespace App\Traits; 

trait CommonControllerFunctions { 

    public function show($id) { 
     $modelObject = $this->model; 

     $model = $modelObject::find($id); 

     return view('glossarium.vocab_update', compact('model')); 
    } 

} 

とあなたのNomenControllerVerbControllerでは、これを行います

use App\Traits\CommonControllerFunctions; 

class VerbController { 

    use CommonControllerFunctions; 

    protected $model = Verb::class; 

} 

注:この例では、単に仕事の周りだけあなたの特定の状況にあることに注意してください...誰もが異なっコードを実践するので、この方法では、すべてが承認していない可能性があります...

+0

ありがとう!私は形質について少し詳しく読んで、それを試してみて、それについて投稿します。 – Bene

+0

この解決策はまだルータの問題を解決しません。開発者はまだ2つのルートを作成する必要があります。 – piotr

+0

@piotr実際には、各リソースルートは1つのコントローラでのみ動作するはずです。すべてを1つのコントローラに入れるのは間違った方法です。ある日、別のフィールドが '動詞'テーブルに追加されたら...新しいコントローラを新しいルート(とにかく)と一緒に作成する必要があり、すべてのステップを繰り返す必要があります。したがって、これはコードを構造化するのが妥当でない習慣であり、私は自分の答えに最後の行を書いた理由をそのようなコーディングの慣例とは認めていません。コード内の各関数は、単一責任規則に従わなければなりません。 – prateekkathal

関連する問題