我有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 对于其他项目来说,同样的事情,在环境的每个文件夹中我放置了不同的文件,但是如何覆盖这些文件?
由于
答案 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个代码库来维护。