46

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

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

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

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

4

10 に答える 10

64

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

Laravel 3の場合(Laravel4およびLaravel5の場合は以下を参照):

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

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

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

通常、次のconfigような設定を持つフォルダがdatabase.phpあります。auth.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'
 );

ps Laravelの現在の3.2.12ビルドでこれをテストしたところですが、間違いなく機能します。

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

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

  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:どうすれば環境価値を得ることができますか?

Laravel 5の場合:

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

于 2012-12-14T02:22:26.860 に答える
8

職人(laravelのコマンドライン)を使用している場合は、追加する必要のあるすべてのコマンド

artisan bla bla bla --env=Development 

また

artisan bla bla bla --env=Production
于 2012-12-15T14:02:22.360 に答える
4

ニーズに合わせてセットアップする方法は次のとおりです。

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

  1. localhost(Mac OSX)-/Library/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ループを実行することもできます。

ヒント: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台のマシンで作業する場合でも、複数のマシンで作業する場合でも、異なる環境への同じパスを持つ可能性は非常に低くなります。

またはそう思います。:)

于 2014-02-07T01:49:06.653 に答える
2

環境固有の構成をセットアップする方法は、公式のLaravelドキュメントにあります。受け入れられた答えの代わりに彼らの方法を使用することをお勧めします:

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

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

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

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

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

<?php

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

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

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

$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...
}
于 2014-02-03T23:01:04.350 に答える
2

Laravel 5

こちらのLaravelドキュメントで詳しく説明されているDotEnvアプローチを使用してください。

Laravel 4

このLaracastsレッスンで推奨されている方法JeffreyWayを使用しています。

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

    /app
        /config
            /local
                database.php
            /production
                database.php
    
  • 本番サーバーで環境変数を設定します。実稼働プラットフォームでの最善のアプローチのためのGoogle。たとえば、UbuntuDreamhostHerokuに関する優れた提案があります。に1行追加しました/etc/environment

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

    $env = $app->detectEnvironment(
        function () {
            return getenv('ENV') ? : 'local';
        }
    );
    
于 2014-04-10T04:07:58.167 に答える
1

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

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

app/config/staging/database.phpapp/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>'
        ]
      ]
   ]);

于 2014-06-26T15:20:31.137 に答える
0

Laravel 3では、環境を検出するために次のようになりました。

Request:env()

これは、paths.phpファイルで見つかったenvironments配列で識別されたものをすべて返します。

Laravel 4で前述したように、今は次のようになっています。

App:: environment()
于 2014-07-10T18:30:02.577 に答える
0

私のやり方!

$env = $app->detectEnvironment( function() {
    if ( file_exists('../.env.local.php') ) {
        return 'local';
    }
    if ( file_exists('../.env.beta.php') ) {
        return 'beta';
    }
    return 'production';
} );
于 2014-09-23T13:28:06.780 に答える
0

Windows環境でLaravelを使用しようとしている場合は、Laravelプロジェクトのトップレベルフォルダーにあるファイル.envの設定を確認してください。これらはconfig/database.phpにあるデータベース設定を上書きします。

于 2015-04-08T16:19:27.427 に答える
0

Laravel 4を使用している場合は、ここにプロセスを段階的に説明する要点があります。私がそれを作成するように導いてくれた@"TheShiftExchange"の答えのおかげです。

于 2015-08-18T15:28:48.310 に答える