Composer 包 - 如果存在则使用自定义模型

Composer package - use custom model if exists

如果这个已经存在,我很抱歉,但我的搜索找不到答案。

我有一个 composer 包,只有在现有模型不存在时才想使用我的模型(或扩展自定义模型),但我似乎不能弄清楚如何在我的作曲家模型中正确指定 "use" 命令。由于我不知道使用该包的 "app" 的名称,因此我无法扩展它。

<?php

namespace MyComposer\Package\Models;

use Illuminate\Database\Eloquent\Model;

class MyPackageModel extends Model
{

如果我把它作为配置选项,我不能在扩展中使用它,即 class MyPackageModel extends config('custom_model_name')

我原以为我应该在 ServiceProvider 中进行检查,但我似乎找不到正确的代码来注册要在其中使用的正确模型名称。

谢谢。

我相信我以前做过类似的事情。但我的方法略有不同。看看有没有道理:

  1. 在您自己的包中创建一个基础 class。这将是后备 如果 "local" 包(消耗的那个 你的包裹)没有它自己的版本;
  2. 创建一个配置文件,说明将使用哪个模型。默认是你自己的包内的模型(即后备);
  3. 安装和设置您的软件包后,如果用户什么都不做,他们将自动获得您的基本模型。如果他们希望使用自定义本地版本覆盖您的基本模型,他们可以简单地扩展您的基本模型并更改要在他们的配置文件中使用的模型。

我还发现,有时基础模型 1) 实现一个 接口 可以在您的包的逻辑中检查而不依赖于特定的 [=41] =](毕竟,这意味着要被覆盖,对吧?); 2) 大部分逻辑都在 trait 中,"local" 模型可以使用它而无需扩展您的模型(如果本地模型已经扩展了其他一些 class 无论出于何种原因)。

您如何处理代码将在很大程度上取决于您打算对该模型执行的操作。比方说,您有一个支持 class 在您的数据库中创建媒体条目。这是您的包裹型号:

<?php

namespace Namespace\Package;

class Media
{
    //...
}

这是默认配置:

<?php

return [

    'model' => \Namespace\Package\Media::class,
];

这里是一个示例操作,您实际上考虑了本地应用程序以覆盖您自己的模型:

<?php

namespace Namespace\Package;

class MediaManager
{
    protected function getModel()
    {
        $model = config('package.model');
        return new $model;
    }

    public function createMedia($attributes = [])
    {
        $media = $this->getModel($attributes);
        $media->save();
        return $media;
    }
}

也就是说,您永远不会从字面上引用任何 Media 模型。您通过 MediaManager 进行操作。当然逻辑非常简单,但希望它足以让我们看到更大的图景。