簡體   English   中英

Laravel存儲庫模式解釋

[英]Laravel repository pattern explanation

我正在使用Repository Pattern在我的Laravel 5.4項目中工作(我對這種模式很新)。 我在網上對此有很多不滿,但我還有兩個重要問題:

>問題#1:

想象一下,我用Laravel ORM Eloquent ,我有一個看起來像這樣的接口:

<?php

namespace App\Repositories\User;

interface UserRepoInterface
{
    /**
     * @param array $user
     */
    public function update(array $request, User $user);
}

您可以看到我已經像參數一樣指定了雄辯的User模型。

雄辯的實現看起來像這樣:

public function update(array $request, User $user)
{
    $user->name             = $request['name'];
    $user->last_name        = $request['last_name'];
    $user->email            = $request['email'];
    $toUpdate->save();
}

所以我的問題:

在我的界面中對雄辯的User模型進行硬編碼是不對的? 在網絡上的很多例子中,我看到人們這樣做,但是如果我想用基於文件的實現交換雄辯的實現呢? 這是一個問題,因為我必須將User模型傳遞給更新方法!

如果我只聲明$user而不是User $user ,那么這個問題的解決方案是什么?

>問題#2:

我該如何處理分頁?

例如,在我雄辯的UserRepository我有一個如下所示的方法:

public function index()
{
    return User::orderBy('name', 'asc')
        ->withCount('messages')
        ->with('corporation')
        ->paginate(10);
}

這是錯的嗎? 我應該只在控制器中分頁嗎?

一個很好的解釋會對我有所幫助。

問題1

Laravel使用ActiveRecord作為其模型+數據訪問層的模式。

這種模式的目標是使事情變得更容易,更快捷。 當您使用Repository模式時,您有點逃避。

要真正使用存儲庫模式,您必須創建數據傳輸對象DAT(在Java中,它們稱之為POJO)。 然后,使用Eloquent實體作為實體管理器。

POPO

class User {

  private $id;
  private $a;

  public setId ($id) { $this->id = $id; } 
  public getId () { return $this->id; } 

  public setA ($a) { $this->a = $a; } 
  public getA () { return $this->a; } 
}

實體經理

class UserEloquent extends Eloquent {
   protected $_table = 'user';
}

知識庫

class EloquentUserRepository implements UserReposistory {
   private $em;

   public __constructor (UserEloquent $em) { $this->em = $em; }

   public update (User $dat) {
     $user  = $em->find($dat->getId());
     $user->a = $dat->getA();
     $user->save();
   }
}

你能看出它有多詳細嗎? 如果你真的想使用這種方法,我建議你使用Doctrine

但是如果你想原樣使用ActiveRecord,我建議你在rails項目上看到一些ruby! 他們真的很擅長這種模式:)

現在我真正想到的是:做出對項目有益的事情。 簡單一點,與您的團隊一起思考並為您構建最佳實踐。 不要總是使用相同的模式,因為有人告訴你。

如果項目小而快,請使用框架為您提供的內容(我不是說放松並制作錯誤的代碼)。 如果這是一個大項目,團隊中有很多開發人員,並且您知道最終您可能想要更改數據訪問層,請考慮存儲庫模式。

當然,有時我們可以采取錯誤的架構決策,但這是我們學習的方式! 並繼續閱讀模式,我認為你正在追隨一個偉大的道路,成為一個偉大的建築師:)

問題2

這取決於你上面的決定。 如果它的Eloquent使用ActiveRecord,無論在哪里調用它(控制器或一些中產階級)。 只需遵循一些模式。 如果您在Controller中調用,請始終在Controller中執行此操作。 否則你會迷失在你的代碼中。

使用Repository,我認為在存儲庫中它很好:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM