我正在开发一个Laravel包,用于跨多个Laravel项目。我需要在包中使用几个Eloquent模型,但由于字段名称和类名可能会根据使用的应用程序而改变,我对在我的包中处理这些依赖项的最佳方法感到困惑。
包的一些背景:不同的项目都是电子商务网站,并且都具有相同的共同元素,例如产品和订单,但数据库字段具有不同的名称,在某些情况下,Laravel模型的命名空间不同或称为不同的东西。我正在尝试构建一个可以被所有这些项目用来分析订单和检测潜在欺诈的包。因为我们使用的一些标准是检查放置帐户的人是否具有以前的订单历史记录以及是否将其放在帐户上,所以我的包需要一些访问方式这个数据。因此,它需要访问订单模型(检查以前的订单历史记录)和帐户模型等内容,但这些内容可能因使用的应用程序而异。
我想要的一般API是能够使用Fraud外观并让它正常工作,而不需要消费应用程序在他们使用此包的任何地方添加一堆代码。像这样:
$fraud = Fraud::checkOrder($order);
return Fraud::getFraudScore();
我目前正在通过创建一个大型配置文件来处理这个问题,该文件通知我的软件包消费应用程序中所需模型的名称以及它们的字段名称。它看起来像这样:
'models' => [
'order' => [
'class' => 'App\Order',
'id' => 'order_id',
'name' => 'customer_name',
...
]
然后在我的包类中,我可以像这样引用它:
protected $orderModel;
public function __construct($options = array())
{
$this->orderModel = $options['models']['order'];
}
protected function findPreviousOrders()
{
$order = $this->orderModel['class'];
$previousOrders = $order::where($this->orderModel['name'], 'Bob')->get();
}
此有效,但对我来说并不是很好。它需要一个庞大的配置文件,并且除非您对所有配置选项有深入了解,否则不能使我的包中的代码非常容易理解。我觉得在模型依赖性和包开发方面我缺少一些基本的东西,但我无法弄明白。有关更好的方法的任何想法?我倾向于要求消费应用程序使用尽可能少的代码来使用此软件包。