web-dev-qa-db-ja.com

Laravel動的構成設定

プロジェクト内でパッケージを使用しており、config/packagename内に設定を保存しています

構成ファイル内でこの値を動的に変更したいのですが、これが現在のファイル構造の見え方です。

<?php

return [
    'view_id' => '118754561',

    'cache_lifetime_in_minutes' => 60 * 24,
];

このようなものに変更したい-

'view_id' => Auth::user()->id,

設定ファイル内でこれを行うことができますか、または後でコントローラ内で更新するために何らかの変数を保存する必要がありますか?これらの変数をenvファイルに配置し、コントローラーからこれらの新しい変数にアクセスする方法はありますか?

24
Courtney Ball

これも。envファイルを動的に更新するための一般的なソリューション(個々のキー/値のペアごと)

  1. Config/packagenameの設定を次のように変更します。
_return [
    'view_id' => env('VIEW_ID', '118754561'),
    etc...
]
_
  1. .envに初期値を追加します。

    VIEW_ID = 118754561

  2. 適切なコントローラー(AuthControllerなど)で、以下のコードを使用して、次のような関数を呼び出します:updateDotEnv('VIEW_ID', Auth::User()->id)

    _protected function updateDotEnv($key, $newValue, $delim='')
    {
    
        $path = base_path('.env');
        // get old value from current env
        $oldValue = env($key);
    
        // was there any change?
        if ($oldValue === $newValue) {
            return;
        }
    
        // rewrite file content with changed data
        if (file_exists($path)) {
            // replace current value with new value 
            file_put_contents(
                $path, str_replace(
                    $key.'='.$delim.$oldValue.$delim, 
                    $key.'='.$delim.$newValue.$delim, 
                    file_get_contents($path)
                )
            );
        }
    }
    _

(スペースが含まれているため、値を二重引用符で囲む必要がある.envのkey = valueペアで作業するために、この関数をより汎用的にしたい場合は、$ delimパラメーターが必要です)。

確かに、プロジェクトでこのパッケージを複数のユーザーが同時に使用している場合、これは良い解決策ではないかもしれません。したがって、このパッケージの使用目的に依存します。

注意:他のクラスから使用する予定の場合は、もちろん関数を公開する必要があります。

19
matthiku

_app/config_ディレクトリに格納されているLaravelフレームワークのすべての設定ファイル。

そのため、カスタム構成値を作成する必要がある場合は、カスタムファイルにカスタム構成を個別に保持することをお勧めします。したがって、_app/config directory_にカスタムファイルを作成する必要があります。

Laravelはこのファイルを設定ファイルとして自動読み取りし、自動管理します。このトピックでは、laravelでカスタム設定を操作し、コントローラーまたはビューで設定値を取得します。

ここで、Laravelでカスタム構成ファイルを作成する方法を説明します。これにより、動的機能を実装できます。

次のような設定キーと値を持つファイルを_app/config/custom.php_に作成します。

_return array(
  'my_val' => 'mysinglelue',
  'my_arr_val' => array('1', '2', '3'),
);
_

ビュー/コントローラーでこれらの構成値を取得する必要があるため、このためにConfigクラスget()メソッドを使用します

構文:

_echo Config::get('filename.arraykey');
_

ここで、filenameは_config file’s name_(この例ではカスタム)、keyはアクセスする値の_array key_です。

私たちの場合、次のようになります。

_echo Config::get('custom.my_val');
_

laravel:-でランタイム構成を作成する

実行時に設定される構成値は現在のリクエストに設定され、後続のリクエストには引き継がれません。

isset()関数を使用してここで動的に構成ファイルを変更できるように、ここで動的な値を渡すことができます。

_ Kundanがisset()の使用を推奨するように破棄する方法と同じように、同じ条件がここに適用されます。しかし、これは、 config。の値の動的設定

_Config::set('custom.my_val', 'mysinglelue');
_

したがって、この方法を使用すると、必要な値に基づいて動的構成ファイルを作成できます。

7
Naresh Kumar P

実際に設定ファイル(_config/packagename.php_または_.env_のいずれか)を編集する場合は、 matthikuの答え に従うことができます。

ただし、私があなただったら、ファイルを変更するのではなく、実行時に定義された値に基づいてこのサードパーティのパッケージを設定したいのではないかと思いますenv値が再度読み込まれます)。

したがって、私の意見では、これを行う最もクリーンな方法は次のとおりです。

  • 構成データに目的の値を保存します。

    config(['packagename.view_id' => Auth::user()->id]);

  • ただし、これはおそらく機能しない可能性があります。必要なサービスを提供するサービスプロバイダーは、リクエストが処理される前、つまり構成の変更が行われる前に登録されることがよくあります。そのため、古い値の設定でサービスを取得しています。

  • では、必要なときだけ(つまり、新しい構成値を設定した後)だけ、サービスプロバイダーを呼び出すことができますか?それをdeferredプロバイダーにすることができます。 「spatie laravel-analytics」の例に従って、この行を_config/app.php_に置き換えます。

    _Spatie\Analytics\AnalyticsServiceProvider::class_

    これで:

    _App\Providers\AnalyticsDeferredServiceProvider::class_

    最後に、次を使用して_App\Providers\AnalyticsDeferredServiceProvider_クラスを作成します。

_<?php
namespace App\Providers;

use Spatie\Analytics\Analytics;
use Spatie\Analytics\AnalyticsServiceProvider;

class AnalyticsDeferredServiceProvider extends AnalyticsServiceProvider
{
    protected $defer = true;

    public function provides()
    {
        return [Analytics::class];
    }
}
_

このようにして、ランタイム構成値を設定した後、サービスをインスタンス化しようとしているときに、プロバイダーに構成値を読み取らせることができます。

7
alepeino

このようにすることができます。

カスタム構成ファイル内。次のコードを追加します。クエリ文字列からIDを動的に送信できます。

'view_id' => isset($_REQUEST['view_id'])?$_REQUEST['view_id']:null,

ビューIDを取得するには

 echo config('app.view_id'); // app is config file name
3
Kundan roy

変更する必要がある場合は、コントローラーでこれを使用します。

  <?php

    use Illuminate\Support\Facades\Config;

     //[...]

    $user_id =  Auth::user()->id; 

    Config::set('view_id', $user_id );
3

config(['packagename.view_id' => Auth :: user()-> id]);

1
Kundan roy

Laravel v5.2以降、設定値を動的に設定できます この方法

<?php

config(['app.timezone' => 'America/Chicago']);

$value = config('app.timezone');

echo $value;
// output: 'America/Chicago'
0
lasec0203