2015-01-20 5 views
5

저는 dotenv 라이브러리를 사용하는 Laravel 5를 사용하기 시작했습니다. 나는이 주제에 읽은 모든에 따르면dotenv에 환경 특정 .env 파일을 저장하는 방법 (Laravel 5)

APP_ENV=local 

, 다른 모든 환경의 특정 구성이이 파일에 배치해야합니다 : 이것은이 줄 환경을 설정하는 프로젝트의 루트에서 .env의 파일을 사용하여 그래서 데이터베이스 암호는 다음이다 등 URL은이 같은 주요 구성 배열로 읽어

env('DB_HOST', 'localhost') 

나는 이것이 내가 정말 당신이 노력하지 않을 수 있습니다 데이터베이스 암호와 같은 몇 가지 특정 일을 위해 작동 할 수 느낌이 있지만 내 환경의 각기 다른 환경 적 가치의 대부분 또는 전부를 저지 할 수 있어야합니다.

따라서 내가 원하는 것은 .env가 "로컬", "스테이징"또는 "프로덕션"으로 APP_ENV를 정의한 다음 .local.env 또는 .env.local 파일에 다음 값을 포함하도록 정의하는 것입니다. 올바른 파일은 APP_ENV에 따라로드됩니다.

이것이 가능합니까? Laravel 4는 더 유연한 계단식 배열을 가지고 있었지만 환경 .env 파일을 가질 수 있으면 살 수 있습니다.

답변

5

이어야합니다. .env을 사용해야합니다. 몇 가지 옵션이 있습니다.

옵션 1 - 변수

'default' => env('DB_CONNECTION'), 

옵션 2 만 .env를 사용 - 변수 만 사용하십시오 .env, 그러나 아무도는

'default' => env('DB_CONNECTION', 'mysql'), 

옵션 3 존재하지 않는 경우 시스템의 기본이 - 그냥 하드를 변수를 코딩하고 설정할 수 없도록 .env

'default' => 'mysql', 

아마도 옵션 2가 대부분의 구성 옵션에 가장 적합합니다. config에 대한 옵션을 git repo에 계속 정의 (및 커밋)하지만 ​​나중에 원하는 경우 .env 파일에서 쉽게 무시할 수 있습니다.

옵션 1은 비밀번호, 앱 키 등을 위해 특별히 잘 맞습니다. 따라서 git repo에 최선을 다하지 않습니다.

옵션 3은 변경되지 않는 몇 가지 구성 변수 용입니다.

- 계단식 Laravel 4 구성 폴더 옵션은 더 이상 사용할 수 없습니다.

+0

감사합니다. 나는이 새로운 메소드가 마음에 들지 않는다. 로컬 폴더를 준비하고 다른 폴더를 준비하고 배열을 이전 방법과 동일하게 캐스케이드하는 함수를 정의 할 것이라고 생각한다. 결국 PHP 파일이므로 배열을 프로그래밍 방식으로 정의 할 수 있습니다. – Gnuffo1

+0

저는 Laravel에서 로컬로 일하고 있습니다. 막 시작된. 내 'laravel'폴더에서 .ENV 파일을 어디서 구할 수 있습니까? –

7

결국 app/Providers/ConfigServiceProvider.php를 수정하여 해결했습니다. 이 파일은 프로젝트를 생성 할 때 app 폴더에 스텁으로 추가되며 설정 값을 덮어 쓰기위한 것입니다.

이제 계단식 구성을 처리하므로 config/local/app.php의 모든 값이 config/app.php를 무시합니다. 아래의 주석은 환경 설정에서 일치하는 배열을 처리하지 못한다고 말했고 그냥 대체 할 것입니다. 그러나 필요할 때 그것을 해결할 수 있습니다.

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use Symfony\Component\Finder\Finder; 

class ConfigServiceProvider extends ServiceProvider { 

    /** 
    * Overwrite any vendor/package configuration. 
    * 
    * This service provider is intended to provide a convenient location for you 
    * to overwrite any "vendor" or package configuration that you may want to 
    * modify before the application handles the incoming request/command. 
    * 
    * Modified 2014-01-20 to allow environment specific configs to be loaded 
    * from app/config/[environment]/ which will cascade over the base configs. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $config = app('config'); 
     $envPath = app()->configPath() . '/' . getenv('APP_ENV'); 

     foreach (Finder::create()->files()->name('*.php')->in($envPath) as $file) 
     { 
      $configName = basename($file->getRealPath(), '.php'); 
      $oldConfigValues = $config->get($configName); 
      $newConfigValues = require $file->getRealPath(); 

      // Replace any matching values in the old config with the new ones. 
      // Doesn't yet handle matching arrays in the config, it will just replace them. 
      $config->set($configName, $newConfigValues + $oldConfigValues); 
     } 
    } 

} 
3

Laravel 5 환경을 쉽게 구성 할 수 있습니다.

  1. 루트 응용 프로그램 폴더를 열고 ".env.example"를 찾아
  2. 복사 ".env의 '로 이름을 변경,
  3. 맞게하십시오".env의는 "환경에 파일,
  4. 하는 경우 GIT를 사용한다면이 파일을 GIT 저장소로 푸시하지 마십시오.

'전체 설명'은이 구성을 here으로 작성합니다.

나는 dotenv 개발자의 의견을 인용합니다.

phpdotenv는 개발 환경 용으로 제작되었으며 일반적으로 을 프로덕션에 사용하지 않아야합니다. 실제 환경에서는 각 요청에 .env 파일을로드하는 오버 헤드가 없도록 실제 환경 인 변수를 설정해야합니다. 이는 Vagrant, chef 또는 Puppet과 같은 도구를 사용하여 배포 프로세스를 자동화하거나 Pagodabox 및 Heroku와 같은 클라우드 호스트로 수동으로 으로 설정할 수 있습니다.

+0

OP는 개발, 테스트 및 생산과 같은 각 환경에 대해 개별 .env 파일을 갖는 방법을 묻습니다. – user2094178

+1

내 답변이 업데이트되었습니다 (개발자의 인용문이 추가되었습니다). 따라서 컴퓨터 당 하나의 .env가 있습니다. 그리고 프로덕션 환경에서는 .env 파일을 사용하지 않아야합니다. – user3851143

+0

실제로'.production.env'가 없어야하지만'.specialenv.env' 파일을 가질 수 있습니다.이 파일은'.env' 파일에 복사하여 그 설정을 사용할 수 있습니다. –