2016-07-07 7 views
0

タクソノミーとその子用語について2つのリポジトリがあります。私はセットアップインターフェースなどを勉強し、それをきれいにして私のコントローラーから雄弁を取り除くためにいくつかのコードを使って作業しています。リレーションシップメソッドをリレーションシップモデルに適用する

エラーを発生させずに子関係にメソッドを適用する方法について頭を悩ましています。私はこれを学んで簡単に移動してくださいが、私は今までしようとしたすべてのiveのトラックを失って周りを回って周りを見渡すと明白な何かを逃して感じる。

MyController.php

​​

TaxonomyInterface.php

interface TaxonomyInterface{ 

    public function createTermFromSlug($term_name); 
} 

DBTaxonomyRepository

class DBTaxonomyRepository 
extends AbstractDBRepository 
implements TaxonomyInterface 
{ 

    protected $table = 'taxonomy'; 

    public $timestamps = false; 

    public function term() 
    { 
     return $this->hasMany('App\Repositories\DBTaxonomyTermRepository', 'taxonomy_id', 'id'); 
    } 

    /** 
    * Create term based on unique slug. 
    * 
    * @param $term_name 
    * @internal param $name 
    */ 
    public function createTermFromSlug($term_name) 
    { 
     $term = $this->firstOrCreate(array(
      'slug' => str_slug($term_name) 
     )); 

     $term->name = $term_name; 

     $term->save(); 
    } 
} 

私は多くのことを試してきましたが、試行錯誤だけではそれを学ぶことができない基本的な何かを明確に欠いています。これは私が残した現在の状態です。

簡単に言えば、リポジトリメソッドをタームエンティティのタクソノミエンティティに適用して、コントローラからの雄弁を切り離したいと考えています。

これを抽象化して、さまざまな分類法を扱うさまざまなコントローラで再利用できるようにしたいと思います。

+0

'AbstractDBRepository'はEloquentを拡張しますか? – user3158900

+0

はい。 'Illuminate \ Database \ Eloquent \ Modelを使用します。 抽象クラスAbstractDBRepository extends Model' – Jimbo

答えて

1

あなたのリポジトリにすべてをダンプする方法では、別の問題(あまりにも多くをやろうとする神のクラスのリポジトリ)のために1つの問題(脂肪コントローラ)を取引していると思います。

リポジトリがあなたのモデルではなく、代わりにリポジトリに注入されているように、私はこれを少し違って構成します。ここにはリポジトリの例があります。

use App\Terms; 
use App\Taxonomy; 

class TaxonomyRepository 
{ 
    protected $term; 
    protected $taxonomy; 

    // Here we are injecting your Term and Taxonomy models 
    public function __construct(Term $term, Taxonomy $taxonomy) 
    { 
     $this->term = $term; 
     $this->taxonomy = $taxonomy; 
    } 

    /** 
    * Create term based on unique slug. 
    * 
    * @param $term_name 
    * @internal param $name 
    */ 
    public function createTermFromSlug($term_name) 
    { 
     $term = $this->term->firstOrCreate([ 
      'slug' => str_slug($term_name) 
     ]); 

     $term->name = $term_name; 

     $term->save(); 
    } 

    public function findTaxonomyBySlug($slug) 
    { 
     return $this->taxonomy->where('slug', $slug)->first(); 
    } 
} 

拡張機能と実装がまだ必要かどうかはわかりません。

次に、あなただけのアイデアは単純です

class MyController 
{ 
    protected $taxRepo; 

    // Here we are injecting your Repository into the controller 
    public function __construct(TaxonomyRepository $taxRepo) 
    { 
     $this->taxRepo = $taxRepo; 
    } 

    public function store(Reques $request) 
    { 
     $taxonomy = $this->taxRepo->findTaxonomyBySlug($this->taxonomy_name); 

     if (isset($taxonomy->id)) { 
      $this->taxRepo->createTermFromSlug($request->name); 
     } 
    } 
} 

...あなたのコントローラにリポジトリを注入。各クラスは1つのことだけを行うべきです(うまくいけばうまくいきます)。 1つのクラスが別のクラスに依存する場合(たとえば、リポジトリに用語と税モデルが必要な場合)、Laravelにそれらを注入させます。

+0

はい、私はそれがもうちょっと面倒だと思って始めていて、完全にそれに慣れていませんでした。私は似たようなものから始めようとしましたが、問題に遭遇してこの道を終わりました。 これは良い方法です。これを試して報告して戻します。どうもありがとう。 – Jimbo

+0

これを変更する時間を得て、それは治療を働きました!ずっといい。私はそれを包括的なサービスで包んだ。どうもありがとう。大変感謝しています。 – Jimbo

関連する問題