Laravel针对不同环境的微小差异

时间:2017-02-22 06:22:39

标签: php laravel laravel-5 environment

我有3个非常相似的项目:95%的代码。 现在,当我必须进行编辑时,我必须复制三次,这非常糟糕!

所以我需要只有一个项目并管理环境之类的小差异。 但我真的不知道好方法。

例如,我有一个具有此功能的控制器

public function save()
    {
        $this->validate($this->request, [
            'firstname' => 'string',
            'lastname' => 'string',
            'gender' => 'string',
            'phone' => 'bail|size:10|required',
            'email' => 'email',
            'birthdate' => 'bail|date',
            'referral_code' => 'bail|string',
            'city' => 'bail|string',
            'call_state' => 'bail|string',
            'call_date' => 'bail|date',
            'campaign' => 'bail|string',
            'note' => 'bail|string',
            'overwritten_by_lead' => 'bail|integer',
            'change_state_counter' => 'bail|integer'
        ]);

        $data = $this->request->all();
        $customer = $this->repository->create( $data );

        return $this->response->item($customer, $this->transformer)->setStatusCode(201);
    }

与另一个项目的区别在于:

public function save()
    {
        $this->validate($this->request, [
            'firstname' => 'string',
            'lastname' => 'string',
            'gender' => 'string',
            'phone' => 'bail|size:10|required',
            'email' => 'email',
            'birthdate' => 'bail|date',
            'referral_code' => 'bail|string',
            'city' => 'bail|string'
        ]);

        $data = $this->request->all();
        $customer = $this->repository->create( $data );

        return $this->response->item($customer, $this->transformer)->setStatusCode(201);
    }

实体内部的另一个区别是:

protected $fillable = [
        'firstname',
        'lastname',
        'phone',
        'email',
        'birthdate',
        'gender',
        'province',
        'zip_code',
        'address',
        'city',
        'campaign',
        'overwritten_by_lead',
        'change_state_counter',
        'call_state',
        'call_date',
        'credit',
        'referral_code'
    ];

这是另一个

protected $fillable = [
        'firstname',
        'lastname',
        'phone',
        'email',
        'birthdate',
        'gender',
        'province',
        'zip_code',
        'address',
        'city'
    ];

在这三个项目中,差异很小,但我需要管理这些。

我不想管理很多因为环境可以超过3个!

使用不同的文件覆盖或管理这些差异到不同环境的最佳方法是什么?

例如,我在文件夹中有项目1:CustomerController和CustomerEntity 对于其他项目来说,同样的事情,在环境的每个文件夹中我放置了不同的文件,但是如何覆盖这些文件?

由于

2 个答案:

答案 0 :(得分:2)

我建议采用以下方法:

第1步:创建文件说config\myenv.php并添加内容如下

<?php
/**
 * Create default Environment
 */
return [
    'current_env' => 'envA'
];

步骤2:根据您的要求或条件动态更改环境,如下所示。 (您可以根据登录或任何地方进行更改)

//Consider you have 3 environment like envA,envB,envC. change according to them
Config::set('myenv.current_env', 'envB');

步骤3:现在说你有一个save(),它在3 diff env中很常见,但略有不同。你可以这样做。 (Imp:改变env后考虑)

public function save(){

    // Config::get('myenv.current_env') will return current loaded environment

    if(Config::get('myenv.current_env') === 'envA'){

       //You code for EnvA

    }

    if(Config::get('myenv.current_env') === 'envB'){

       //You code for EnvB

    }

    if(Config::get('myenv.current_env') === 'envC'){

       //You code for EnvC

    }
}

第3步:为您models我建议为每个环境创建单独的model。如下所示,

现在考虑你有Repository模型。 (app\Repository) 如果稍后在同一模型中进行编辑,则维护起来会很复杂。您可以为每个env创建单独的模型,如下所示。

app\Models\enva\Repository -> For Env A
app\Models\envb\Repository -> For Env B
app\Models\envc\Repository -> For Env C

现在您可以在控制器中使用它们,如下所示

if(Config::get('myenv.current_env') === 'envA'){

    // App\Models\enva\Repository::your_methods()

}

if(Config::get('myenv.current_env') === 'envB'){

    // App\Models\envB\Repository::your_methods()

}

同样,您可以区分环境。

重要的是如何检测环境

希望它可以帮到你!

答案 1 :(得分:0)

为什么不将共享代码/属性抽象为自定义包并从那里开始工作?你可以扩展基地&#39;您当前项目中的包中的类,只在需要时将其他数据传递给这些方法,如果推迟过多,则将其完全重载。

这将消除检查您正在使用的项目的需要。

例如:

- /vendor/package/path
  - Models
    - BaseModel (extends eloquent)
    - ModelA (extends BaseModel)
    - ModelB (extends BaseModel)
  - Controllers
    - SomeController (extends base controller) 
  - ...

在您的应用中,您可以创建

- /app/path
  - Http
    - Controllers
      - SiteController (extends package controller)
      - ..
  - Models
    - ModelA (extends package ModelA)
    - ...

您可以在包中添加共享代码(例如所有共享字段),并在不需要更改时将其保留。如果您需要为自定义foo执行,比如说SiteA,只需重载可填写或验证规则(或在基类中创建一个方法,可以将它们合并到您的喜欢中)。

通过这种方式,您可以利用所有共享功能并在需要时重载自定义属性或方法。

这不一定是一个包btw,你可以定义一个库或共享命名空间,并在composer.json中使用classmap magic

"autoload": {
    "classmap": [
        "database",
        "app/Library" <--
    ],

但在你的情况下,我会建议创建一个包,1个代码库来维护。

相关问题