在Laravel 4中抽象数据库交互的最佳实践

时间:2013-09-17 17:02:40

标签: php laravel laravel-4 database-abstraction

我目前的情况是用户能够完成一个表格,这可能会导致创建几个不同的模型。例如,他们发布了一个待售汽车的广告,但在这样做时,他们需要创建一个新品牌以及一个新的汽车模型(因为这些尚未存在于数据库中)。

目前,此表单正在“AdvertController”中处理。我现在想要将我的数据库交互抽象到一个存储库中。我的问题如下......

  1. 我应该有一个数据库交互存储库,还是每个模型一个存储库?
  2. 如果每个模型一个,哪个文件(控制器或存储库)应该处理确定是否需要创建新模型的逻辑。
  3. 换句话说,以下哪种工作流程是最佳实践(如果确实如此)?

    (假设数据库具有以下关系:广告m-1 CarModel m-1品牌)

    Form completed -> Advert Controller
    AdvertController -> tells CarModel repository to create new CarModel model
    CarModel_Respository -> creates new CarModel
    AdvertController -> sets CarModel relationship with the newly created brand
    AdvertController -> tells Brand repository to create new CarModel model
    Brand_Respository -> creates new Brand
    AdvertController -> tells Advert repository to create new Advert model
    Advert_Repository -> creates new Advert
    AdvertController -> sets Advert relationship with CarModel
    AdvertController -> displays success message
    

    或......这样的......

    Form completed -> AdvertController.
    AdvertController -> sends data to DatabaseRepository
    DatabaseRepository -> creates new Brand model
    DatabaseRepository -> creates new CarModel model
    DatabaseRepository -> sets CarModel brand_id as the newly created brand
    DatabaseRepository -> creates new Advert model
    DatabaseRepository -> sets Advert car_model_id as newly created CarModel
    DatabaseRepository -> Sends success message to AdvertController
    AdvertController -> sends success message to user.
    

1 个答案:

答案 0 :(得分:1)

Laravel的伟大之处在于可以灵活地实现您的需求。通常没有“单一正确”的方式来做事 - 但有很多方法。

Taylor在他的书(From Apprentice to Artisan)中谈到了这个问题,基本上你应该确定哪个选项最适合你。

就个人而言,我会选择一个处理所有逻辑的存储库,并与后端的不同模型进行交互。这是一个很好的分离问题。

这意味着您的控制器只需要知道单个存储库,而存储库处理所有后端交互。