web-dev-qa-db-ja.com

Laravelの環境駆動型データベース設定?

Laravelフレームワークに移動していますが、データベースの設定に問題があります。

具体的には、環境をセットアップし、application.php構成ファイルで正常に機能していますが、database.php構成ファイルは効果がないようです。

環境フォルダーにdatabase.php構成ファイルが読み込まれていなくても、多数の無効な文字(キーボードマッシュ)をファイルに入れてphpにエラーをスローさせますが、ヒットすることはありません。

Laravel環境ベースのデータベース設定をサポートしていませんか?またはこれを間違っていますか?

45
Hailwood

環境ごとにデータベース設定(およびその他の構成設定)を確実に設定できます。

For Laravel 3(for Laravel 4 and Laravel 5以下を参照):

まず-$environmentspaths.phpを定義し、次のように設定する必要があります。

$environments = array(
  'development' => array('*.dev'),
  'production' => array('*.com'),
);

Laravelは自動的にこの変数を探し、設定されている場合、関連する設定を使用します。

通常、configフォルダーがあり、database.phpauth.phpなどの設定があります

次に、使用する予定のLaravel_Envごとに新しいフォルダーを作成します(開発など)。このようなフォルダー構造になります。

/application
  /config
    /development
      database.php
    /production
      database.php
    application.php
    config.php
    database.php
    ...
    user_agents.php

各サブフォルダーにdatabase.phpのみを含めていることに注意してください。 Laravelは常に最初にデフォルトの構成設定をロードし、次に環境設定からのカスタム構成でそれらをオーバーライドします。

最後に、開発/データベースファイルには、次のようなものがあります。

<?php
 return array(
'default' => 'mysql'
 );

p.s。 Laravel-の現在の3.2.12ビルドでこれをテストしたところ、間違いなく動作します。

ボーナスヒント:Artisanの環境を自動的に設定することもできるため、各コマンドラインに環境を手動で含める必要はありません!これをする:

  1. Artisanを実行している「ホスト名」を知る必要があります。調べるには-ルートフォルダーのartisan.phpを一時的に編集し、var_dump(gethostname());を2行目(つまり、すべての上)に追加します。

  2. コマンドラインからphp artisanを実行します。ホスト名を含む文字列ダンプを取得します。私の場合、その「TSE-Win7」;

  3. artisan.phpファイルへの変更を削除します

  4. ホスト名(つまり、「TSE-Win7」)を環境に追加します。

次のような結果になるはずです。

$environments = array(
  'development' => array('*.dev', 'TSE-Win7'),
  'production' => array('*.com'),
);

これで、Artisanは開発環境を使用して実行されます。ライブサーバーにデプロイする場合-これらの手順を再実行してサーバーのhostname()を取得し、サーバー専用の特定の職人構成を構成できます!

Laravel 4:

デフォルトの環境は常にproductionです。ただし、start.phpファイルでは、追加の環境を定義できます。

 $env = $app->detectEnvironment(array(
   'local' => array('your-machine-name'),
));

LinuxおよびMacでは、ターミナルでhostnameと入力してhostnameを決定できます。コンピューターの名前が出力されます。 Windowsでは、dd(gethostname());routes.phpファイルの先頭に配置し、Webサイトを1回実行すると、コンピューターの現在のホスト名が表示されます。

現在の環境をアプリケーションの変数として取得するには-これを読んでSOここに答えてください。 Laravel 4:どうすれば環境値を取得できますか?

For Laravel 5:

ルートディレクトリに.envという単一の構成ファイルがあります。 このlaracastを見てください 、構成は完全に説明されています。

64
Laurence

アーティザン(laravelのコマンドライン)を使用している場合、追加する必要のあるすべてのコマンド

artisan bla bla bla --env=Development 

または

artisan bla bla bla --env=Production
8
Knight

必要に応じてセットアップする方法は次のとおりです。

私は個人的に4つの異なる構成が必要です:

  1. localhost(Mac OSX)-/ライブラリ/WebServer/Documents/www/my-domain.com/development/
  2. dev.my-domain.com(VPS)-/var/www/my-domain.com/development/
  3. test.my-domain.com(VPS)-/var/www/my-domain.com/test/
  4. my-domain.com(VPS)-/var/www/my-domain.com/web/

4つの環境すべてに独特のディレクトリ構造があるため、phpのマジック定数__ DIR __を使用してアプリディレクトリを取得し、strpos()関数を使用して簡単なチェックを行うことができます。適切な環境を返します。 Artisan環境も同様に処理され、環境を手動で入力したり、マシン名を追加したりする必要はありません。

内部

bootstrap/start.php

コールバック関数を追加する

$env = $app->detectEnvironment(function(){

  $haystack = __DIR__; // Catch the directory path

  // Set the booleans (remove the first '/', else strpos() will return 0)
  $isLocal       = strpos($haystack, 'Library/WebServer/Documents/www/my-domain.com/development/');
  $isDevelopment = strpos($haystack, 'var/www/my-domain.com/development/');
  $isTest        = strpos($haystack, 'var/www/my-domain.com/test/');
  $isProduction  = strpos($haystack, 'var/www/my-domain.com/web/');

  // Set the environments
  if ($isLocal)       $environment = "local";
  if ($isDevelopment) $environment = "development";
  if ($isTest)        $environment = "test";
  if ($isProduction)  $environment = "production";

  // Return the appropriate environment
  return $environment
});

別の選択肢

すべての値を一度に設定して配列に取り込み、foreachループを実行することもできます。

Tip:strpos()関数を使用しているため、指定された値の最初の出現位置を$ haystackに対してチェックし、ポジション番号。パス全体を実際に提供する必要はありません。各パスから独特の値を追加するだけで、仕事を完了できます。

// Check the boolean, if true set to given value, else set NULL
$environments[] = strpos($haystack, "Library") ? 'local'      : NULL;
$environments[] = strpos($haystack, "develop") ? 'development': NULL;
$environments[] = strpos($haystack, "test")    ? 'test'       : NULL;
$environments[] = strpos($haystack, "web")     ? 'production' : NULL;

// Loop through each, if not null then we have our environment
foreach ($environments as $environment) {
     if(!is_null($environment))
     return $environment;
}

1台のマシンで作業する場合でも、複数のマシンで作業する場合でも、異なる環境への同じパスを持つ可能性は非常にわずかです。

またはそう思う。 :)

4
Faiyaz Haider

環境固有の設定のセットアップ方法は公式のLaravel docs。受け入れられた答えの代わりにそれらの方法を使用することをお勧めします:

多くの場合、アプリケーションが実行されている環境に基づいて異なる構成値を使用すると便利です。たとえば、本番サーバーとは異なるローカル開発マシンで異なるキャッシュドライバーを使用する場合があります。これは、環境ベースの構成を使用して簡単に実現できます。

Configディレクトリ内に、ローカルなどの環境名に一致するフォルダーを作成するだけです。次に、オーバーライドする構成ファイルを作成し、その環境のオプションを指定します。たとえば、ローカル環境のキャッシュドライバーをオーバーライドするには、app/config/localに次の内容のcache.phpファイルを作成します。

<?php    
return array(    
    'driver' => 'file',    
);

注:環境名として「テスト」を使用しないでください。これは単体テスト用に予約されています。基本構成ファイルにあるすべてのオプションを指定する必要はなく、オーバーライドするオプションのみを指定することに注意してください。環境構成ファイルは、基本ファイルを「カスケード」します。

次に、どの環境で実行されているかを判断する方法をフレームワークに指示する必要があります。デフォルトの環境は常に実稼働環境です。ただし、インストールのルートにあるbootstrap/start.phpファイル内で他の環境をセットアップできます。このファイルには、$ app-> detectEnvironment呼び出しがあります。このメソッドに渡された配列は、現在の環境を決定するために使用されます。必要に応じて、他の環境とマシン名をアレイに追加できます。

<?php

$env = $app->detectEnvironment(array(    
    'local' => array('your-machine-name'),    
));

この例では、「local」は環境の名前、「your-machine-name」はサーバーのホスト名です。 LinuxおよびMacでは、hostname terminalコマンドを使用してホスト名を決定できます。

より柔軟な環境検出が必要な場合は、detectionEnvironmentメソッドにClosureを渡すことができます。これにより、必要に応じて環境検出を実装できます。

$env = $app->detectEnvironment(function()
{ 
    $domain = explode('.', $_SERVER['HTTP_Host']);
    switch($domain[0])
    {
        case 'localhost':
        case 'localhost:8080':                
        case 'dev':
            return 'development';
            break;
        case 'mysite':
        default:
            return 'production';
            break;
    }
});

環境メソッドを使用して、現在のアプリケーション環境にアクセスできます。

現在のアプリケーション環境へのアクセス

$environment = App::environment();

環境が指定された値と一致するかどうかを確認するために、環境メソッドに引数を渡すこともできます。

if (App::environment('local'))
{
    // The environment is local
}

if (App::environment('local', 'staging'))
{
    // The environment is either local OR staging...
}
2
Justin

Laravel 5

the Laravel docs here で詳述されている DotEnv アプローチを使用します。

ララベル4

この Laracastsレッスン で推奨されているメソッドJeffrey Wayを使用しています。

  • configディレクトリを作成します 環境ごと

    /app
        /config
            /local
                database.php
            /production
                database.php
    
  • 実稼働サーバーで環境変数を設定します。実稼働プラットフォームでの最適なアプローチについては、Googleをご覧ください。たとえば、 buntDreamhost 、および Herok の優れた提案があります。 /etc/environmentに1行追加しました:

    ENV=production
    
  • このクロージャーを/bootstrap/start.phpに追加します。このセットアップでは、ENV環境変数が欠落しているサーバーは、デフォルトでlocal環境構成になります。

    $env = $app->detectEnvironment(
        function () {
            return getenv('ENV') ? : 'local';
        }
    );
    
2
Troy Harvey

今日、私はこれに取り組んでおり、データベースの環境設定を最適に行う方法を見つけるのに苦労しています。最後に、いくつかの方法を試した後、@ troy-harveyに、これを行うことのJeffrey Wayの推奨が(少なくとも私にとっては)最高であることに完全に同意します。私がこれに追加することの1つ、そしてその今日私を支えたのは、(そして間違っている場合は私を修正してください)あなたがオーバーライドしようとしている設定にアクセスする必要があることです対応する配列キーによる環境設定ファイル。私は単純な配列を返し始めました:

return [
    'database' => '<db_name>',
    'username' => '<db_user>',
    'password' => '<db_pass>',
]; 

app/config/staging/database.php。これには何の効果もありませんでしたが、多くの頭を掻いた後、app/config/database.php、 そのようです:

<?php

return [
'connections' => [
    'mysql' => [
        'database' => '<db_name>',
        'username' => '<db_user>',
        'password' => '<db_pass>'
    ]
  ]
];

少なくともこれで、ようやく設定を取得できるようになりました。

他の誰かがこれを解決するのに苦労している場合に備えて、ここにこれを追加します。気づいたとき、私は自分が犯している間違いがどれほど明白かを理解しました。

2014年7月1日編集

これに対する追加のコメントは、4.1 Laravel=は環境設定をメインの設定配列に追加するためのappend_config()ヘルパー関数とともに出荷されるためです。

上記の例では、これは次のようになります。

<?php

return append_config([
     'connections' => [
        'mysql' => [
             'database' => '<db_name>',
             'username' => '<db_user>',
             'password' => '<db_pass>'
        ]
      ]
   ]);
1
Schneidey

Laravel 3では、環境を検出しました。

Request:env()

これは、paths.phpファイルにある環境配列で識別されたものをすべて返します。

Laravel 4で前に述べたように、今は:

App:: environment()
0
Robert Brisita

Laravel 4 ここに要点 が表示されている場合は、プロセスをステップごとに説明します。私はそれを作成します。

0
Mwirabua Tim

私のやり方!

$env = $app->detectEnvironment( function() {
    if ( file_exists('../.env.local.php') ) {
        return 'local';
    }
    if ( file_exists('../.env.beta.php') ) {
        return 'beta';
    }
    return 'production';
} );
0
Abi Xalmon

Windows環境でLaravel=を使用しようとしている場合、Laravelプロジェクト-これらのconfig/database.phpにあるデータベース設定を上書きします

0
Phil Pearce