簡體   English   中英

如何通過存儲庫模式和Laravel的Eloquent填充自定義對象

[英]How to fill a custom object via the repository pattern and Laravel's Eloquent

好的,這是交易。 我正在使用自定義CMS,我希望代碼盡可能優化。 我一直在閱讀/觀看tuts / etc。 就像對存儲庫模式大為瘋狂,以及對Laravel的Eloquent專門使用它一樣。 這里可能有一些非常愚蠢的問題/想法,但請忍受。 :-)有時候,如果沒有傻話,就沒有簡單的方法來詢問術語/最佳實踐。

與許多事情一樣,我有數百萬種方法可以使其“發揮作用”。 我的困境本質上是“最佳實踐”的問題。

一般情況/問題

假設我正在嘗試從數據庫獲取CMS的Page 據我了解,使用Eloquent設置repository pattern的典型方法是擁有以下文件:

  • Page.php- 雄辯的模型
  • PageRepositoryInterface.php- 頁面回購中應該包含的內容的“合同”
  • EloquentPageRepository.php- 可以通過Eloquent抓取數據的Page存儲庫

很簡單。 所以我可能會用這種方式。 假設我有一個getPageById的方法EloquentPageRepository.php ,我可以做這樣的事情從我的控制器:

$page = $this->repo->getPageById();

現在我的問題出現了:getPageById()應該返回什么類型的數據? 有人建議將其設置為返回Eloquent集合。 其他人則只是說一個普通數組或通用對象。

理想情況下,我覺得我的場景最適合讓EloquentPageRepository從Eloquent抓取數據並實際上返回我擁有的自定義Page類的實例。 例如,與此類似的東西:

<?php  namespace Acme\Repositories\EloquentPageRepository;

use Acme\...\PageObject as PageObject; // Better name than PageObject?

//...

class EloquentPageRepository implements PageRepositoryInterface {

    // Omitting constructor, etc.

    public function getPageById($id)
    {
        // Grab the row via Eloquent (obviously not stored in Page:: at
        // this point. I'm just using it here for clarity and time's sake.
        $page = Page::find($id);

        // Now we have an Eloquent collection stored in $page, but I'd
        // like to return the data inside an instance of my custom class.
        $pageObj = new PageObject($page->title, $page->body);

        return $pageObj;
    }
}

在我看來,這似乎很好,因為它在回購之間提供了一致的交付格式。 它還允許我在pageObject上執行一些構造函數邏輯。 最后,它允許我在PageObject上有一些自定義方法(與存儲庫無關)。

它類似於一個收藏,但是我不認為是那樣。 基本上,這只是我立即用數據庫信息填充的類的實例。

我的問題,列出:

  1. 使用回購將雄辯的數據填充到特定對象並返回它是否被認為是不好的做法?
  2. 我不想將我的類稱為“ PageObject”,因為那只是la腳。 我寧願稱其為“ PageCollection”,但實際上它實際上不是一個集合。 我使用此類的方式實際上有名稱嗎? 不是收藏,而是...? 我對此一無所知,我只是在搜索您輸入的任何內容。
  1. 整個過程取決於您對存儲庫模式的期望。 您是否在使用存儲庫模式,因為將來您將需要處理數據層並需要一個新的存儲庫。 如果您使用的是Eloquent,只要您的cms有效,那么您可以返回一個雄辯的對象。 如果您希望它非常靈活,請創建一個新的頁面對象(如注釋中所述的PageComposer)。 這是存儲庫模式的優勢之一,因此我建議您創建一個PageComposer類,該類由存儲庫實例化並返回。
  2. 通常,您可以將其稱為Page,因為它是一個頁面,並且附帶了頁面的某些信息。 但是您已經在Eloquent模型中使用了這個名稱。 您可以考慮更改雄辯的模型名稱並調用返回對象Page。

暫無
暫無

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

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