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

时间:2016-08-09 13:17:33

标签: laravel laravel-5 laravel-5.2 laravel-5.1

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

我有一个作曲家包,并且只想在现有模型不存在(或扩展自定义模型)的情况下使用我的模型,但我似乎无法弄清楚如何指定"使用"在我的作曲家模型中正确命令。因为我不知道" app"的名称。使用包裹,我无法延长它。

<?php

namespace MyComposer\Package\Models;

use Illuminate\Database\Eloquent\Model;

class MyPackageModel extends Model
{

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

我原本以为我应该在ServiceProvider中进行检查,但我似乎找不到合适的代码来注册在那里使用的正确型号名称。

感谢。

1 个答案:

答案 0 :(得分:1)

我相信,我之前做过类似的事情。但我的方法略有不同。看看是否有意义:

  1. 在您自己的包中创建基类。这将是后备 如果&#34; local&#34;将使用的模型包(一个消费 你的包裹)没有自己的版本;
  2. 创建一个配置文件,说明将使用哪个模型。默认值是您自己的包中的模型(即后备);
  3. 安装并设置包后,如果用户什么都不做,他们将自动提供您的基本模型。如果他们希望使用自定义本地版本覆盖您的基本模型,他们可以简单地扩展您的基本模型并更改要在其配置文件中使用的模型。
  4. 我还发现有时它对基本模型有用1)实现一个接口,可以在你的包的逻辑中检查而不依赖于一个特定的类(毕竟,它意味着被覆盖,对吧?); 2)将大部分逻辑放在 trait 中,&#34; local&#34;模型可以在不必扩展模型的情况下使用(如果本地模型因任何原因已经扩展了其他类,则至关重要)。

    您如何处理代码非常依赖于您计划对该模型执行的操作。比如说,您有一个支持类,可以在数据库中创建媒体条目。这是您的包装模型:

    <?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进行操作。当然,逻辑非常简单,但希望它足以让人们了解更多。