2016-07-07 41 views
0

我有2個分類和其子條款的回購。我設置接口等等,並一直在通過一些代碼來清理它,並從我的控制器中刪除雄辯,因此也使它們變得很瘦。將存儲庫方法應用於關係模型

我很努力地讓我的頭在如何應用方法的孩子關係沒有得到錯誤。請輕鬆地學習這一點,但感覺即將失去一些顯而易見的東西,並在圈子裏走來走去,一直到現在爲止都失去了一切。

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'擴展了雄辯嗎? – user3158900

+0

是的。 '使用Illuminate \ Database \ Eloquent \ Model; 抽象類AbstractDBRepository extends Model' – Jimbo

回答

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); 
     } 
    } 
} 

的想法很簡單。每個班級只應做一件事(希望做得好)。如果一個類取決於另一個類(例如存儲庫需要術語和稅收模型),Laravel會爲您注入它們。

+0

是的,我開始認爲它已經變得有點混亂,並不完全適應它。我確實試着從類似的東西開始,但遇到了問題並最終走上了這條道路。 這看起來很不錯。請試試這個報告。非常感謝。 – Jimbo

+0

有時間做這個變化,它工作的一種享受!好多了。我把它包裝在一個整體服務中。非常感謝。不勝感激。 – Jimbo