SORU
15 EYLÜL 2013, Pazar


Laravel yönetme ilişkileri, depo desen kalarak

Laravel iyi tasarım desenleri T. Otwell kitabı okuduktan sonra Laravel 4'te bir uygulama oluştururken uygulama her tablo için arşivler oluşturma kendimi buldum.

Aşağıdaki tablo yapısı ile sona erdi:

  • Öğrenciler: ıd, adı
  • Dersler: ıd, adı, teacher_id
  • Öğretmenler: ıd, adı
  • Atamaları: ıd, adı, course_id
  • Puanları (öğrenciler ve atamaları arasında bir pivot gibi davranır): student_id, assignment_id, puanları

Oluşturmak, güncellemek ve bu bilgileri saklamak için yöntemler bulmak silmek ve akıllı sınıflar var. Her depoyu veritabanı ile etkileşim güzel konuşan bir model vardır. Laravel belgelerine başına modelinde tanımlanan ilişkiler: http://laravel.com/docs/eloquent#relationships.

Yeni bir rota oluştururken, ben her Ders yatırma yöntemi oluşturmak arıyor. Bu ödevler vardır, bir oluştururken, aynı zamanda bu derste her öğrenci için skor tablosunda bir giriş oluşturmak istiyor. Atama Depo ile yapıyorum. Bu atama iki Dokunaklı modelleri ile depo iletişim kurar, Atama ve Öğrenci modeli ile ifade eder.

Benim sorum: bu uygulama muhtemelen büyümek boyutu ve daha fazla ilişki olacak tanıttı, iyi pratik iletişim ile Anlamlı farklı modellerde depoları ya da bu yapılabilir kullanarak diğer depoları yerine (yani çağıran diğer depoları Atama depo) ya da bu olsun yapılan bu Anlamlı modeller hep birlikte?

Ayrıca, atamalar ve öğrenciler arasında bir pivot olarak puan tablosunu kullanmak için iyi bir alıştırma olur ya da başka bir yerde yapılmalı?

CEVAP
24 EYLÜL 2013, Salı


Büyük bir projeyi Laravel 4 kullanarak bitirmek üzere olduğum ve şimdi soruyorsun cevap vardı. Mevcut Laravel tüm kitapları Leanpub ve Googling ton okuduktan sonra, aşağıdaki yapı ile geldim.

  1. Buluntu ise rastlantısal kabul edilebilecek her masa için bir Beliğ Model sınıfı
  2. Beliğ Model başına bir Depoyu sınıf
  3. Birden fazla Depo sınıflar arasında iletişim kurabilir bir Hizmet sınıfı.

Hadi bir film veritabanı oluşturma olduğumu söylüyor. Beliğ Model sınıfları aşağıdaki en azından şu olurdu:

  • Film
  • Studio
  • Yönetmen
  • Aktör
  • Gözden geçirin

Depoyu bir sınıf her Beliğ Model sınıf saklanması ve veritabanı üzerinde CRUD işlemleri için sorumlu olacaktır. Depo sınıflar bu gibi görünebilir:

  • MovieRepository
  • StudioRepository
  • DirectorRepository
  • ActorRepository
  • ReviewRepository

Her depo sınıfı, aşağıdaki arabirim uygulayan: BaseRepository bir sınıf uzanacak

interface BaseRepositoryInterface
{
    public function errors();

    public function all(array $related = null);

    public function get($id, array $related = null);

    public function getWhere($column, $value, array $related = null);

    public function getRecent($limit, array $related = null);

    public function create(array $data);

    public function update(array $data);

    public function delete($id);

    public function deleteWhere($column, $value);
}

Hizmet sınıfı birden fazla havuzları tutkal için kullanılır ve "" uygulama. iş mantığı gerçek içerir DenetleyicilerisadeceOluşturmak için Hizmet sınıfları, Güncelleme ve Silme eylemleri ile iletişim kurun.

Veritabanında yeni Film kaydı oluşturmak istediğimde, MovieController benim sınıfı aşağıdaki yöntemleri olabilir:

public function __construct(MovieRepositoryInterface $movieRepository, MovieServiceInterface $movieService)
{
    $this->movieRepository = $movieRepository;
    $this->movieService = $movieService;
}

public function postCreate()
{
    if( ! $this->movieService->create(Input::all()))
    {
        return Redirect::back()->withErrors($this->movieService->errors())->withInput();
    }

    // New movie was saved successfully. Do whatever you need to do here.
}

Her şey senin için belirlemek nasıl POST veri kontrolörleri, ama diyelim ki veri tarafından döndürülen Input::all() postCreate() yöntemini görünüyor gibi bir şey bu

$data = array(
    'movie' => array(
        'title'    => 'Iron Eagle',
        'year'     => '1986',
        'synopsis' => 'When Doug\'s father, an Air Force Pilot, is shot down by MiGs belonging to a radical Middle Eastern state, no one seems able to get him out. Doug finds Chappy, an Air Force Colonel who is intrigued by the idea of sending in two fighters piloted by himself and Doug to rescue Doug\'s father after bombing the MiG base.'
    ),
    'actors' => array(
        0 => 'Louis Gossett Jr.',
        1 => 'Jason Gedrick',
        2 => 'Larry B. Scott'
    ),
    'director' => 'Sidney J. Furie',
    'studio' => 'TriStar Pictures'
)

Bu MovieRepository veritabanında Oyuncu, Yönetmen ya da Stüdyo kaydı oluşturmak için bilmek gerekmez mi beri, böyle bir şey olabilir hangi MovieService bizim sınıf, kullanacağız:

public function __construct(MovieRepositoryInterface $movieRepository, ActorRepositoryInterface $actorRepository, DirectorRepositoryInterface $directorRepository, StudioRepositoryInterface $studioRepository)
{
    $this->movieRepository = $movieRepository;
    $this->actorRepository = $actorRepository;
    $this->directorRepository = $directorRepository;
    $this->studioRepository = $studioRepository;
}

public function create(array $input)
{
    $movieData    = $input['movie'];
    $actorsData   = $input['actors'];
    $directorData = $input['director'];
    $studioData   = $input['studio'];

    // In a more complete example you would probably want to implement database transactions and perform input validation using the Laravel Validator class here.

    // Create the new movie record
    $movie = $this->movieRepository->create($movieData);

    // Create the new actor records and associate them with the movie record
    foreach($actors as $actor)
    {
        $actorModel = $this->actorRepository->create($actor);
        $movie->actors()->save($actorModel);
    }

    // Create the director record and associate it with the movie record
    $director = $this->directorRepository->create($directorData);
    $director->movies()->associate($movie);

    // Create the studio record and associate it with the movie record
    $studio = $this->studioRepository->create($studioData);
    $studio->movies()->associate($movie);

    // Assume everything worked. In the real world you'll need to implement checks.
    return true;
}

Yani kaldık ilgilendiren ne güzel, mantıklı bir ayrılık. Depoları sadece onlar ve veritabanından alınacak Ekle Beliğ modeli farkındayız. Denetleyicileri depoları hakkında umurumda değil, onlar sadece onlar kullanıcı toplamak ve aktarmak uygun hizmet için veri el. Hizmet umursamıyornasılaldığı verileri veritabanına kaydedilir, sadece uygun depoları kontrol cihazı tarafından verildi ilgili verileri Çek.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LiquidMusick

    LiquidMusick

    23 Aralık 2010
  • TotalSeminarsChannel

    TotalSeminar

    16 Mart 2010
  • JeezyVEVO

    JeezyVEVO

    12 Mayıs 2009