2016-07-07 5 views
0

У меня есть 2 репо для таксономии и его детей. Ive и т. Д., И работали через некоторый код, чтобы очистить его и удалить красноречивые из моих контроллеров, а также сделать их тощими.Применение метода репозитория для моделей отношений

Я изо всех сил пытаюсь понять, как применять методы к отношениям с детьми, не получая ошибок. Пожалуйста, поймите, чтобы я научился этому, но чувствую, что я потерял что-то очевидное и обойдусь в кругах, теряя следы всего, что ive пробовал до сих пор.

MyController.php

$taxonomy = $taxonomies->findBySlug($this->taxonomy_name); 

if (isset($taxonomy->id)) { 

    // The below line worked and what im trying to replace below to remove firstOrCreate from my controller 

    //$taxonomy->term()->firstOrCreate(array('name' => $request->name, 'slug' => str_slug($request->name))); 

    $taxonomy->term()->createTermFromSlug($request->name); 
} 

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

Да. 'use Illuminate \ Database \ Eloquent \ Model; abstract class 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