wake-up-neo.net

Laravel dynamische Konfigurationseinstellungen

Ich verwende ein Paket in meinem Projekt und es speichert eine Einstellung in config/packagename

Ich möchte diesen Wert in der Konfigurationsdatei dynamisch ändern. So sieht die Dateistruktur aktuell aus.

<?php

return [
    'view_id' => '118754561',

    'cache_lifetime_in_minutes' => 60 * 24,
];

Ich möchte es in etwas ändern - 

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

Können Sie dies in der Konfigurationsdatei tun, oder müssen Sie eine Variable speichern, die später in einem Controller aktualisiert werden soll. Gibt es eine Möglichkeit, diese Variablen in einer ENV-Datei zu platzieren und von einem Controller aus auf diese neuen Variablen zuzugreifen?

22
Courtney Ball

Dies ist auch eine generische Lösung, um Ihre .env-Datei dynamisch zu aktualisieren (jeweils die einzelnen Schlüssel/Wert-Paare)

  1. Ändern Sie die Einstellung in Ihrem Konfigurations-/Paketnamen wie folgt:
return [
    'view_id' => env('VIEW_ID', '118754561'),
    etc...
]
  1. Fügen Sie in .env einen Anfangswert hinzu:

    VIEW_ID = 118754561

  2. Verwenden Sie in einem geeigneten Controller (z. B. AuthController) den folgenden Code und rufen Sie die Funktion folgendermaßen auf: 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)
                )
            );
        }
    }
    

(Der $ delim-Parameter ist erforderlich, wenn Sie diese Funktion generischer gestalten möchten, um mit key = value-Paaren in .env zu arbeiten, wobei der Wert in Anführungszeichen eingeschlossen werden muss, da sie Leerzeichen enthalten.

Zugegebenermaßen ist dies möglicherweise keine gute Lösung, wenn Sie mehrere Benutzer gleichzeitig verwenden und dieses Paket in Ihrem Projekt verwenden. Es hängt also davon ab, wofür Sie dieses Paket verwenden.

Hinweis: Sie müssen die Funktion natürlich öffentlich machen, wenn Sie sie von anderen Klassen verwenden möchten.

18
matthiku

Wenn Sie die Konfigurationsdateien tatsächlich bearbeiten möchten (entweder config/packagename.php Oder .env), Können Sie matthikus Antwort .

Wenn ich Sie wäre, würde ich dieses Paket von Drittanbietern wahrscheinlich lieber auf der Grundlage eines zur Laufzeit definierten Werts konfigurieren, anstatt eine Datei zu ändern (was übrigens erst bei der nächsten Anforderung wirksam wird, wenn die env-Werte werden erneut gelesen).

Meiner Meinung nach ist der sauberste Weg dies zu tun:

  • speichern Sie Ihren gewünschten Wert in den Konfigurationsdaten:

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

  • Möglicherweise werden Sie jedoch feststellen, dass dies wahrscheinlich nicht funktioniert: Der Dienstanbieter, der den von Ihnen benötigten Dienst bereitstellt, wird häufig registriert, bevor die Anforderung verarbeitet wird, dh bevor Ihre Konfigurationsänderung stattfindet. Sie erhalten also weiterhin den Dienst mit den alten Werten config.

  • Wie können Sie also den Dienstanbieter nur bei Bedarf anrufen lassen und nicht vorher (dh nach dem Festlegen des neuen Konfigurationswerts)? Sie könnten es zu einem aufgeschobenen Anbieter machen. Ersetzen Sie nach Ihrem Beispiel für "spatie laravel-analytics" in config/app.php Diese Zeile:

    Spatie\Analytics\AnalyticsServiceProvider::class

    mit diesem:

    App\Providers\AnalyticsDeferredServiceProvider::class

    und erstellen Sie schließlich die Klasse App\Providers\AnalyticsDeferredServiceProvider mit:

:

<?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];
    }
}

Auf diese Weise kann der Provider die Konfigurationswerte lesen, wenn Sie den Dienst instanziieren möchten, nachdem Sie die Konfigurationswerte für die Laufzeit festgelegt haben.

7
alepeino

Das kannst du so machen.

In Ihrer benutzerdefinierten Konfigurationsdatei. Fügen Sie den folgenden Code hinzu. Sie können Ihre ID dynamisch aus der Abfragezeichenfolge senden.

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

Ansichts-ID erhalten

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

Alle Konfigurationsdateien von Laravel Framework im Verzeichnis app/config gespeichert.

wenn Sie also benutzerdefinierte Konfigurationswerte erstellen müssen, sollten Sie unsere benutzerdefinierte Konfiguration in der benutzerdefinierten Datei . getrennt aufbewahren. Daher müssen Sie in app/config directory eine benutzerdefinierte Datei erstellen. 

Laravel liest diese Datei automatisch als Konfigurationsdatei und verwaltet sie automatisch. In diesem Thema arbeiten wir mit der benutzerdefinierten Konfiguration in Laravel und erhalten den Konfigurationswert im Controller oder in der Ansicht.

Jetzt werde ich erklären, wie man eine benutzerdefinierte Konfigurationsdatei in Laravel erstellt, damit wir dynamische Funktionen dazu implementieren können.

erstellen Sie eine Datei in app/config/custom.php, die über Konfigurationsschlüssel und Werte wie folgt verfügt: -

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

Jetzt müssen diese Konfigurationswerte in Ansicht/Controller abgerufen werden, daher verwenden wir die Config-Klasse get()-Methode

Syntax:

echo Config::get('filename.arraykey');

dabei ist filename der config file’s name, in unserem Fall custom, und key der array key des Werts, auf den Sie zugreifen möchten.

In unserem Fall wird es so sein:

echo Config::get('custom.my_val');

Laufzeitkonfiguration in laravel erstellen: -  

Konfigurationswerte, die zur Laufzeit festgelegt werden, werden für die aktuelle Anforderung festgelegt und nicht auf nachfolgende Anforderungen übertragen.

Sie können die dynamischen Werte hier übergeben, damit Sie die Konfigurationsdatei mithilfe der isset()-Funktionen hier dynamisch ändern können.

Wie der @Kundan roy, wie er mit isset() vorgeschlagen wurde, gilt hier dieselbe Bedingung. Dies ist jedoch die alternative Methode, die für die dynamische Einstellung der Werte in der Konfiguration geeignet ist.

Config::set('custom.my_val', 'mysinglelue');

Mit dieser Methode können Sie daher die dynamischen Konfigurationsdateien basierend auf den erforderlichen Werten erstellen.

3
Naresh Kumar .P

Verwenden Sie dies im Controller, wenn Sie Änderungen vornehmen müssen. 

  <?php

    use Illuminate\Support\Facades\Config;

     //[...]

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

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

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

0
Kundan roy

Seit Laravel v5.2 können Sie die Konfigurationswerte dynamisch einstellen auf diese Weise :

<?php

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

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

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