2017-02-22 5 views
2

У меня есть 3 проекта, которые очень похожи: 95% кода. Теперь, когда я должен сделать редактирование, я должен копировать это три раза, и это очень плохо!Laravel небольшие различия для разных сред

Поэтому мне нужно иметь только один проект и управлять небольшими различиями с чем-то вроде окружения. Но я не знаю, как это сделать.

Например, у меня есть контроллер с этой функцией

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 То же самое для другого проекта, внутри каждой папки среды Я помещаю файлы, которые отличаются, но как я могу перезаписать эти файлы?

Thanks

+0

Что вы подразумеваете под окружающей средой? –

+0

Если я прав, то это как 'разработка | постановка | производство ... '? –

+0

Окружающая среда Imean - это другой проект, например 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: Теперь у вас есть save(), который является общим в 3 дифф окр с небольшой разницей. Вы можете сделать, как показано ниже. (Imp: Рассмотрим после изменения окр)

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() 

} 

Аналогично можно дифференцировать среды.

Важно то, как вы собираетесь обнаружить окружающую среду

Надеется, что это помогает!

+0

Это решение мастерской отлично Я думаю, но я не люблю подход многих, если, если среда станет 10, у вас есть большая функция с 10, если –

+0

Вы правы. Для этой проблемы вы можете создать промежуточное ПО, которое позаботится об env. Но как вы будете отличаться кодом в той же функции? Кроме того, вам нужно создавать отдельные файлы –

+0

Я думал обойтись с разными файлами.В каждой среде есть папка с файлами. Внутри приложения я вызову customerController italy вместо 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, просто перегрузите правила заполнения или проверки (или создайте метод в своих базовых классах, которые могут объединить их по вашему вкусу).

Таким образом, вы можете использовать все общие функции и перегружать пользовательские атрибуты или методы там, где это необходимо.


Это не должен быть пакет кстати, вы могли бы так же, как вэй определить библиотеку или общее пространство имен и использовать classmap магию в вашем composer.json

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

Но в вашем случае я предложит создать пакет, 1 кодовую базу для поддержки.

Смежные вопросы