【发布时间】:2019-04-26 13:18:10
【问题描述】:
在我的 Laravel REST API 项目中,我主要使用 3rd 方 API。为此,我有一个按 API(Accommodation、Planning、Discount 等)分组的“Services”文件夹,用于向 API 发送正确的参数并获取原始数据。
感觉这里需要使用适配器模式,因为这个第3方输出需要格式化。
让我试着举个例子。
我有一个 EventDao 接口(数据访问对象)和一个或多个具体的 EventDao 类,例如 EventbriteDao。
我还为每个具体的 DAO 提供了一个适配器。例如:EvenbriteAdapter
我将在某处拥有一些业务逻辑,因此我需要一个 Event entity 类。要将适配器的数据传递给实体,我需要一个 EventDTO 类(数据传输对象)
我终于可以调用 eventDao(通过接口感谢 Laravel 的服务提供者)
我将其原始输出传递给适配器,然后将适配器的输出传递给实体。然后我可以调用实体类的方法之一。 (之后我需要将其转换为适当的 json 数据,但这是简单的部分。)
我不知道在哪里放置其他 CRUD 逻辑,如 updateEvent、deleteEvent、getAll 等。我应该直接在控制器中调用它们还是创建存储库(存储库模式 )?我对此感到困惑。
这是一种好方法还是过度设计?因为除了控制器之外,我还有 5-6 个类/接口。
另一个问题是直接在控制器中调用 EventbriteAdapter。我应该有一个接口吗?在这种情况下,我需要将服务和适配器接口都绑定到其在 AppServiceProvider 中的实现。
我的另一个问题是实体块的集合。如果我调用 getAll() 方法,我可以遍历数据并创建一个对象数组,但我对此并不满意。 Laravel 的集合会很有用,但我想将应用层与域分开。有什么好的解决方案?
这里我提到的一些文件的示例代码是:
interface EventAdapter
{
public function getId();
public function getName();
public function getStartDate();
public function getLocationName();
}
class EventbriteAdapter implements EventInterface
{
private $raw;
public function __construct(array $raw)
{
$this->raw = $raw;
}
public function getName()
{
return $this->raw['name'];
}
public function getStartDate()
{
return $this->raw['start'];
}
public function getLocation()
{
return $this->raw['venue']['name'].' '.$this->raw['venue']['address'];
}
}
// Fetch event from Eventbrite (or other third-party)
$result = fetchEventFromEventbrite();
// Wrap event in adapter
$adapter = new EventbriteAdapter($result);
【问题讨论】:
-
这个问题有很多内容,所以很难回答。当我处理更复杂的模式时,我经常参考这个文档,它可以帮助我做出决定:github.com/alexeymezenin/laravel-best-practices。希望它能给你一些方向:)。
-
感谢@hdifen 的链接实际上这并不是 Laravel 特有的,但你是对的。关于同一个问题有很多事情。我希望我能挺过去。 :)
标签: laravel design-patterns architecture repository adapter