如何通过存储库模式和groovy 's Eloquent来填充自定义对象


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

好的,事情是这样的。我正在使用自定义CMS,我希望代码尽可能优化。我一直在读/看tuts/等等。我非常喜欢存储库模式,特别是在Laravel的Eloquent中使用它。这里可能有一些非常愚蠢的问题/想法,但请耐心听我说。:-)有时候问术语/最佳实践的问题很难不显得很傻。

和许多事情一样,我有无数种方法可以"让它工作";我的困境本质上是一个"最佳实践"问题。

一般情况/问题

让我们假设我试图从数据库中获得一个页面。根据我的理解,用Eloquent设置repository pattern的典型方法是拥有以下文件:

  • Page.php—雄辩模型
  • PageRepositoryInterface.php——应该在Page repo的
  • 中的"合约"
  • EloquentPageRepository.php——可以通过Eloquent
  • 抓取数据的Page存储库

简单。所以我可以这样用。假设我在EloquentPageRepository.php中有一个getPageById方法,我可以在控制器中这样做:

$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. 使用repo将有说服力的数据填充到特定对象中并返回它是否被认为是不好的做法?
  2. 我不想叫我的类"PageObject",因为那只是蹩脚。我更愿意把它叫做"PageCollection "除了它实际上不是一个集合。我使用这个类的方式有名字吗?这不是收藏,这是…?我不知道这个,我只是在寻找你的任何输入。
  1. 这完全取决于您对存储库模式的期望。您是否正在使用存储库模式,因为将来您将切换数据层并需要一个新的存储库。如果你使用Eloquent,只要你的cms还活着,你就可以返回一个Eloquent对象。如果你想让它非常灵活,然后做一个新的页面对象(PageComposer在评论中提到)。这是存储库模式的优点之一,所以我建议您创建一个由存储库实例化并返回的PageComposer类。
  2. 通常你可以叫它Page因为它是一个页面,它传送页面的一些信息。但是你已经给雄辩模型起了这个名字。您可以考虑更改雄辩的模型名称并将返回对象称为Page。