2017-02-22 5 views
2

나는 매우 유사한 3 개의 프로젝트가 있습니다 : 코드의 95 %. 편집을해야 할 때 그 세 번 복사해야하고 매우 나쁩니다!다른 환경에 대한 Laravel의 작은 차이점

그래서 하나의 프로젝트 만 있고 환경과 같은 작은 차이를 관리해야합니다. 그러나 나는 그 좋은 방법을 정말로 모른다.

예를 들어 I이 함수

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' 
    ]; 

그리고 이것은 또 다른

입니다. 0
protected $fillable = [ 
     'firstname', 
     'lastname', 
     'phone', 
     'email', 
     'birthdate', 
     'gender', 
     'province', 
     'zip_code', 
     'address', 
     'city' 
    ]; 

3 가지 프로젝트에서 약간의 차이점이 있지만이를 관리해야합니다.

많은 경우 관리하고 싶지 않아 환경이 3 이상이 될 수 있기 때문에!

이러한 차이를 파일이 다른 여러 환경으로 덮어 쓰거나 관리하는 가장 좋은 방법은 무엇입니까?

예를 들어, 폴더 안에 프로젝트 1이 있습니다. CustomerController 및 CustomerEntity 환경의 모든 폴더에있는 다른 프로젝트의 경우와 같은 점은 다른 파일을 넣지 만 어떻게하면이 파일을 덮어 쓸 수 있습니까?

감사합니다.

+0

환경이란 무엇입니까? –

+0

내가 맞다면'development | 스테이징 | 생산 ...? –

+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은 diff ENV에서 흔히있는 save()을 말한다. 다음과 같이 할 수 있습니다.

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를 변경 한 후 고려) : 당신이 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() 

} 

아래로 컨트롤러에서 사용할 수 있습니다.

중요 당신이

는 당신 희망이 도움이 환경을 감지하려고하는 방법입니다!

+0

이 솔루션 워크숍 괜찮아요.하지만 생각하지 않습니다. 많은 경우의 접근 방식입니다. 환경이 10이되면 큰 기능을 가지고 있기 때문에 10이면 –

+0

맞습니다. 이 문제의 경우 env를 처리 할 미들웨어를 만들 수 있습니다. 하지만 같은 기능으로 코드를 어떻게 다르게 할 것입니까? 다른 파일을 만들려면 –

+0

다른 파일로 관리하는 것이 좋습니다.모든 환경에는 파일이있는 폴더가 있습니다. 내부 응용 프로그램 나는 고객 CONTACT 대신 이탈리아의 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에서 채우기 또는 유효성 검사 규칙을 오버로드하거나 기본 클래스에 메서드를 만들어 원하는대로 병합 할 수 있습니다.

이렇게하면 모든 공유 기능을 활용하고 필요에 따라 사용자 지정 특성이나 메서드를 오버로드 할 수 있습니다.


이 그냥 아이 도서관 또는 공유 네임 스페이스를 정의하고 composer.json

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

에 그러나 귀하의 경우 classmap 마법을 사용할 수 있기 때문에, 패키지 BTW 될 필요가 없습니다 I 유지할 패키지, 1 코드베이스 생성을 제안합니다.