Soru Laravel dinamik yapılandırma ayarları


Projemde bir paket kullanıyorum ve içinde bir ayar saklıyor config/packagename

Bu değeri yapılandırma dosyasında dinamik olarak değiştirmek isterim, dosya yapısı şu anda nasıl görünüyor;

<?php

return [
    'view_id' => '118754561',

    'cache_lifetime_in_minutes' => 60 * 24,
];

Bunu böyle bir şeye değiştirmek istiyorum -

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

Bunu yapılandırma dosyasında yapabilir misiniz, yoksa daha sonra bir denetleyicide güncellenecek bir çeşit değişken depolamanız gerekir. Bu değişkenleri bir env dosyasına yerleştirmenin ve bu yeni değişkenlere bir denetleyiciden erişmenin bir yolu var mı?


21
2017-09-18 21:54


Menşei


Sentry kullanıyor musunuz? - Daebak Do
Bağlam, yapmaya çalıştığınız şey için harika olurdu. Bana gösterdiğiniz şeyden yola çıkarak, evet bu mümkün. - Derek
hangi Laravel sürümünü kullanıyorsunuz? - Daebak Do
Laravel 5.2 kullanarak özür dilerim Bir yapılandırma dosyasındaki bir statik ID setini bir veritabanında saklanan bir taneye güncellemeye çalışıyorum. - Courtney Ball
Merhaba Courtney, içeriğinizin bir kısmını (kullanıcı, dil, müşteri kimliği gibi) bir yapılandırma parametresi olarak ele almaya çalışıyormuşsunuz gibi görünüyor. İyi bir fikir gibi görünebilir, ancak birçok dezavantaja sahiptir - diyelim ki, cronjob'den bir çok kullanıcıya e-posta göndermek istediğinizi varsayalım. İçeriğinizi (userId gibi) denetleyiciden hizmetlere (ve daha derine) doğrudan iletmenizi öneririm, yalnızca $ userId argümanı veya kapsamı içerecek bir çeşit Context nesnesi kullanılarak yapılabilir, böylece kodunuz Genel ayarlarda değil, doğrudan bağlamda güveniyor. - Casey


Cevaplar:


Bu aynı zamanda .env dosyanızı dinamik olarak güncellemek için genel çözüm (bireysel anahtar / değer çiftleri)

  1. Config / packagename'daki ayarı şu şekilde değiştirin:
return [
    'view_id' => env('VIEW_ID', '118754561'),
    etc...
]
  1. .Env'ye başlangıç ​​değeri ekleyin:

    VIEW_ID = 118754561

  2. Uygun bir kontrolörde (ör. AuthController), aşağıdaki kodu kullanın ve aşağıdaki gibi fonksiyonu çağırın: 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)
                )
            );
        }
    }
    

(Bu işlev, anahtarlar, değer içerdikleri için çift tırnak içine alınacak anahtar. Değeri değerleriyle çalışmak için daha geneldir).

Kuşkusuz, projenizde bu paketi kullanarak aynı anda birden fazla kullanıcınız varsa, bu iyi bir çözüm olmayabilir. Yani bu paketi ne için kullandığınıza bağlı.

Not: Diğer derslerden kullanmayı planlıyorsanız, elbette fonksiyonu kamuya açık hale getirmelisiniz.


15
2017-09-29 15:29



Bir dizi olarak konfigürasyon değerlerim varsa ne olur? bir şey gibi 'cavPref' => ['F','C','R','G','H','E']? - SaidbakR


Yapılandırma dosyalarını gerçekten düzenlemek isterseniz (ya config/packagename.php veya .env) o zaman takip edebilirsiniz matthiku'nun cevabı.

Ancak, ben senin yerinde olsaydım, bu 3. parti paketi herhangi bir dosyayı değiştirmek yerine, çalışma zamanında tanımlanmış bir değere dayanarak yapılandırmak isterim (ki bu arada bir sonraki istekte bulunmaz). env değerleri tekrar okunur).

Bu nedenle, bence, bunu yapmanın en temiz yolu:

  • İstediğiniz değeri yapılandırma verilerinde saklayın:

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

  • Ancak, muhtemelen işe yaramayacağını fark edebilirsiniz: Gereksinim duyduğunuz hizmeti sağlayan servis sağlayıcı, istek işlenmeden önce, yani yapılandırma değişikliğinizden önce kayıtlıdır. Yani hala eski değerler yapılandırmasıyla hizmet alıyorsunuz.

  • Böylece, servis sağlayıcısına sadece ihtiyaç duyulduğunda ve daha önce değilken (yeni yapılandırma değerini belirledikten sonra) nasıl çağrılabilirsiniz? Sen yapabilirsin vadeli sağlayıcısı. "Spatie laravel-analytics" örneğinizi takip ederek config/app.php bu hat:

    Spatie\Analytics\AnalyticsServiceProvider::class

    Bununla birlikte:

    App\Providers\AnalyticsDeferredServiceProvider::class

    ve sonunda App\Providers\AnalyticsDeferredServiceProvider sınıf, ile:

:

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

Bu şekilde, herhangi bir çalışma zamanı yapılandırma değeri belirledikten sonra, hizmeti başlatmak üzere olduğunuzda sağlayıcının yapılandırma değerlerini okuyabilmesini sağlayabilirsiniz.


6
2017-09-29 19:08



Bu çözümü deneyen oldu mu? Bende aynı problem var. - Juan Pablo Fernandez
Bu çözümleri kullanıcı oturumunda oturum ömür boyu değerini değiştirebilir miyim? İstediğim, farklı kullanıcılar için farklı oturum ömürleri uygulamaktır (veritabanından kullanıcı tipi değerine bağlı olarak). - Jay Pandya


Bunu yapabilirsin.

Özel yapılandırma dosyanızda. Aşağıdaki kodu ekleyin ID'nizi dinamik olarak sorgu dizesinden gönderebilirsiniz.

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

Görünüm kimliği almak için

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

3
2017-10-04 09:05





Laravel çerçevesinin tüm yapılandırma dosyaları app/config dizin.

özel yapılandırma değerleri oluşturmamız gerekiyorsa, özel yapılandırmamızı özel dosyada ayrı tutmak daha iyi olurdu. bu yüzden özel dosya oluşturmamız gerekiyor app/config directory.

Laravel otomatik olarak bu dosyayı bir yapılandırma dosyası olarak okur ve otomatik olarak yönetir. Bu konuda laravel'de özel konfigürasyon ile çalışıyoruz ve kontrolör veya görünümde konfigürasyon değerini alıyoruz.

Şimdi Laravel'de özel bir yapılandırma dosyasının nasıl oluşturulacağını açıklayacağım, böylece buna dinamik özellik uygulayabileceğiz.

bir dosya oluştur app/config/custom.php hangi yapılandırma anahtarları ve değeri gibi: -

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

Şimdi yapılandırma / denetleyicide bu yapılandırma değerlerini almamız gerekiyor, böylece Config sınıfını kullanacağız get() bunun için yöntem

Sözdizimi:

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

nerede filename öyle mi config file’s name, bizim durumumuzda özel ve anahtar array key erişmek istediğiniz değerin

Bizim durumumuzda şöyle olacaktır:

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

Laravel'de çalışma zamanı yapılandırması oluşturun: - 

Mevcut istek için çalışma zamanında ayarlanan yapılandırma değerleri, sonraki istekler üzerine taşınmaz.

Dinamik değerleri buradan buraya aktarabilirsiniz, böylece yapılandırma dosyasını burada kullanarak dinamik olarak değiştirebilirsiniz. isset() fonksiyonlar.

#Kundan roy nasıl kullanıldığını önerdiği gibi isset() aynı durum burada için geçerlidir. Ancak bu, yapılandırmadaki değerlerin dinamik olarak ayarlanması için çalışacak alternatif bir yöntemdir.

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

Bu nedenle, bu yöntemi kullanarak dinamik yapılandırma dosyalarını ihtiyaç duyduğunuz değerlere göre oluşturabilirsiniz.


3
2017-10-05 09:53



Bu daha yüksek olmalı. Laravel'in özellikle Config::set() bu tür senaryolar için. - Andrew
İlk olarak, bu yapılandırma oluşturur değerlerdeğil, yapılandırma Dosyalar. İkincisi, bu, dosyada yazılı olan yapılandırma değerlerinin Laravel uygulama yaşam döngüsünün başlangıcında okunması sorunuyla ilgilenmez. Bu nedenle, bu değerlere bağlı olan herhangi bir hizmet sağlayıcı, bu yöntemle veya başka bir yöntemle ayarladığınız orijinal değeri kullanmaz. Cevabım (stackoverflow.com/a/39778179/3208258) bu davaları işlemeye teşebbüs etmişlerdir. - alepeino
Bahsettiğin doğru. Fakat benim projemde, yapılandırma değerlerini dinamik olarak sadece Config::set() yöntem ve mükemmel çalışır. Umarım soruya karşı tüm diğer alternatiflere sahip olursun. Bu yöntemi öneririm. Bu kadar. Bunun laravelde dinamik konfigürasyon için çalışacağından eminim. - Naresh Kumar .P


Değiştirmeniz gerektiğinde bunu kontrol cihazında kullanın.

  <?php

    use Illuminate\Support\Facades\Config;

     //[...]

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

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

2
2017-10-03 07:04





Aslında yapılandırma değerlerini dinamik hale getirmeye zorlayan bu kod noktanız varsa, o zaman yapılandırma dosyasının kullanımı sadece gerekli değerlerin başlatılması için olduğu için kod akışınızda bir yanlışlık olması gerekir - uygulamadan önce tanımlanması gereken yüklendi.

Yapılandırma değerlerini dinamik yapmak bir "KÖTÜ UYGULAMASI" kodlama dünyasında. Yani probleminiz için aşağıdaki alternatif var.

.Env dosyasındaki değeri tanımlama (isteğe bağlı)

VIEW_ID=your_view_id_here

Denetleyicinin içindeki değeri kullan

$auth_id = auth()->user()->id;
$view_id = env('VIEW_ID', $auth_id);
// If .env file doesn't contains 'VIEW_ID' it will take $auth_user as the view_id

Umarım bu size yardımcı olur!


0
2017-10-05 17:49



yapılandırma değerlerinin dinamik olarak değiştirilmesi, birim testinde çok yararlı olabilir; burada belirli bir test, testin geçmesi için etkinleştirilmiş işleve ayarlanmış 1 veya 2 yapılandırma değeri gerektirir. Bu 1 veya 2 yapılandırma değeri normal olarak ayarlanamaz. Testin dışında, bunun Kötü Bir Uygulama olduğunu görebiliyorum - lasec0203


Laravel v5.2'den beri dinamik olarak yapılandırma değerlerini ayarlayabilirsiniz bu yoldan:

<?php

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

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

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

0
2017-08-14 05:07