2017-02-22 12 views
2

私は非常に似ている3つのプロジェクトがあります:コードの95%。 編集をしなければならないときは、それを3回コピーする必要があります。とても悪いです!異なる環境では小さな違いがあります

私は1つのプロジェクトしか持たず、環境のような小さな違いを管理する必要があります。 しかし、私は本当に良い方法を知らない。例えば

私はこの機能

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つのプロジェクトの中には、ほとんど違いはありませんが、これらを管理する必要があります。

多くの場合、管理したくない場合は、環境が3以上になる可能性があるためです。

異なるファイルを持つ異なる環境にこれらの相違を上書きまたは管理する最良の方法は何ですか?

たとえば、プロジェクト1のフォルダ内にCustomerControllerとCustomerEntityがあります。 環境のすべてのフォルダ内の他のプロジェクトと同じことを、別のファイルに置きますが、どのようにこれらのファイルを上書きできますか?

ありがとうございました

+0

環境はどういう意味ですか? –

+0

私は正しければ '開発|ステージング|生産...? –

+0

環境たとえば、siteForEngland、siteForItaly、siteForSpainなどの異なるプロジェクトを選択します。私はそれが環境のようだと思う –

答えて

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(あなたが好きな場所あなたは、ログインに応じて変更したり、場合があります):今、あなたはわずかな違いで3差分ENVでは一般的であるsave()を持っていると言います。あなたは以下のようにすることができます。あなたmodelsのために、私は環境ごとに別々のmodelを作成することをお勧めします:

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:(インプはENVを変更した後に考えてみましょう)。以下のように、

今すぐあなたが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() 

} 

以下のように、コントローラにそれらを使用することができます。

重要なのは、あなたが

はそれがあなたのお役に立てば幸い環境を検出しようとしている方法です!

+0

このソリューションワークショップはいいと思いますが、私は好きではありません。もし環境が10になると、あなたは10の大きな機能を持っているので、多くの場合のアプローチは –

+0

です。この問題では、envの世話をするミドルウェアを作成することができます。しかし、同じ機能でコードをどのように違うのでしょうか?それ以外の場合は、別々のファイルを作成する必要があります –

+0

私は別のファイルで管理することを考えました。すべての環境にはファイルがあるフォルダがあります。アプリケーション内で私はイタリアのcustomercontrollerの代わりに、顧客コントローラのcustomerControllerを呼び出します –

0

共有コード/属性をカスタムパッケージに抽象化してそこから作業するのはなぜですか?現在のプロジェクトのパッケージから '基本'クラスを拡張するだけで、必要に応じて追加のデータを渡すか、あまりにも過度に遅延させると完全にオーバーロードされます。

これにより、使用しているプロジェクトを確認する必要がなくなります。例えば

- /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といって、入力可能なルールや検証ルールをオーバーロードするだけです(あるいは、あなたの好みにマージできるベースクラスにメソッドを作成する)。

このようにして、必要に応じてすべての共有機能とカスタム属性またはメソッドをオーバーロードすることができます。


これはあなただけWELライブラリまたは共有の名前空間を定義し、あなたのcomposer.json

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

にしかし、あなたの場合には、クラスマップの魔法を使用できるよう、パッケージところでである必要はありませんI 1つのコードベースを維持するパッケージを作成することを提案します。