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?
Dies ist auch eine generische Lösung, um Ihre .env-Datei dynamisch zu aktualisieren (jeweils die einzelnen Schlüssel/Wert-Paare)
return [ 'view_id' => env('VIEW_ID', '118754561'), etc... ]
Fügen Sie in .env einen Anfangswert hinzu:
VIEW_ID = 118754561
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.
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.
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
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.
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 );
config (['packagename.view_id' => Auth :: user () -> id]);
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'