# Yapılandırma Okuma ve Yazma

https://dev.wisecp.com/tr/yapilandirma-okuma-ve-yazma

Ayarlar farklı kuralları olan iki yerde durur: talep üzerine yüklenen PHP dosyaları ve dosyaya ait olmayan değerler için veritabanı satırları.

## Genel Bakış

Yapılandırma dosyası, dizi döndüren bir PHP dosyasıdır. Birini okumak bir dosya işlemi değil, bir yol ifadesidir: dosyayı adlandırır, sonra eğik çizgilerle dizinin içine yürürsünüz; dosya, ilk soruluşta yüklenir.

İkinci depo bir tablodur; geliştiricinin gönderdiği yapılandırma değil, kuruluma özgü durum olan değerler için. İkisine de aynı sınıftan, farklı metot adlarıyla erişilir ve kaçınmaya değer hata yanlış olanı seçmektir.

## Referans

### Dosya Tabanlı Ayarlar

```php
public static function get($arg = null);
public static function set($key, $values, $merge = false): array|false;
public static function save($name = '', $data = []): bool;
public static function merge($arg = []): bool;
```

- **get($arg)**: İlk yol parçası dosyadır, gerisi onun döndürdüğü dizinin içine yürür. Eksik olan her parça `false` yanıtlar, yani saklanmış bir false ile hiç ayarlanmamış bir anahtar aynı görünür. Argümansız çağrı o ana kadar yüklenmiş dosyaları verir, var olan bütün dosyaları değil.
- **set($key, $values, $merge)**: Yüklü kopyayı bu istek için değiştirir, hiçbir şey yazmaz. İlk argüman dosya adı, ikincisi değerlerdir. `[$key => $birlesmis]` yanıtlar; değerler boşsa ya da dosya yoksa `false`.
- **save($name, $data)**: Diziyi dosyasına geri yazar ve yüklü kopyayı tazeler; böylece aynı istekteki sonraki okuma yeni değeri görür. İkinci argüman verilmezse o dosya için bellekte ne varsa onu kaydeder. Yazmanın başarılı olup olmadığını yanıtlar.
- **merge($arg)**: Bu istek için yüklü kümeye bütün girdiler katar; yani anahtarları ayar değil dosya adıdır. Diskte karşılığı olmayan sanal bir dosya için kullanışlıdır.
- **coremio/configuration**: Dosyaların durduğu yer, ad başına bir tane: `general`, `options`, `theme`, `crypt`, `sms` ve diğerleri.

### save Neyi Bekler, Neyi Yazar

Dosya, döndürülen bir dizidir ve kendi adına sarılmış olabilir de olmayabilir de. İki biçim de kabul edilir: diskteki dosya sarılıysa ve verdiğiniz veri değilse, yazmadan önce sizin için sarılır.

```php
<?php
return [
    'cache'    => 'on',
    'rich-url' => 'on',
];
```

```php
Config::save("general", ['cache' => 'on', 'rich-url' => 'on']);
Config::save("general", ['general' => ['cache' => 'on', 'rich-url' => 'on']]);
```

Kaynak, dizi dışa aktarıcısıyla üretilir ve dosya yöneticisinden geçirilerek yazılır; o da az önce değiştirdiği dosyanın derlenmiş kopyasını geçersiz kılar. Ham bir yazma bunu kendi yapmak zorundadır.

### Veritabanı Tabanlı Ayarlar

```php
public static function getd($name = '');
public static function setd($name = '', $content = '');
public static function deld($name = '');
```

- **getd($name)**: Adlandırılmış tek satırı okur. Geçerli JSON olan bir değer çözülmüş hâlde geri gelir; yani dizi yine dizidir, saklanan bir sayı sayıdır, ama yalnız çözülen değer doğru değerliyken: saklanan sıfır, boş dizi ve boş nesne yazıldıkları metin olarak geri gelir, yani `0`, `[]` ve `{}`. Var olmayan satır `null` yanıtlar.
- **setd($name, $content)**: Ada göre ekler ya da günceller. Dizi sizin için kodlanır, kalan her şey verildiği gibi saklanır. Yeni satıra bir oluşturma ve bir güncelleme zamanı yazılır; güncelleme yalnız güncelleme zamanına dokunur.
- **deld($name)**: Satırı siler. Yumuşak silme yoktur ve sonraki okuma `null` yanıtlar.

### Depo Seçimi

| Değer | Depo | Neden |
| --- | --- | --- |
| Operatörün bir kez ayarladığı anahtar | Dosya | Neredeyse her istekte okunur; dosya okuma sorgudan ucuzdur |
| Bir servisin kimlik bilgileri | Dosya, modülün kendi dosyası | Modülle birlikte taşınır, tablolara dağılmaz |
| Uygulamanın kendi güncellediği durum | Veritabanı | Sık yazılır ve dosya yazımı bunun için doğru araç değildir |
| Tek bir operatörün tercihi | Hiçbiri | Kişiye özel tercih kuruluma değil o kişiye aittir |

## Örnek

Dosyayı okuyun, değeri değiştirin, yazın ve aynı istekte geri okuyun.

```php
public function save_general(Operation $operation): bool
{
    $operation->demo();

    $data          = Config::get("general");                  // dosyanın tamamı
    $data['cache'] = Filter::init("POST/cache", "route") === 'on' ? 'on' : 'off';

    if (!Config::save("general", $data))
        throw new Exception(Language::gc("error/settings-not-written"));

    // Aynı istek, ve değer şimdiden yenisi.
    $now = Config::get("general/cache");

    // Uygulamanın sahip olduğu durum bunun yerine satır deposuna gider.
    Config::setd("last_settings_change", ['at' => date('c'), 'cache' => $now]);

    return $operation->output(['status' => "successful", 'cache' => $now]);
}
```

```php
$state = Config::getd("last_settings_change");   // dizi, sizin için çözülmüş

if ($state === null) {
    // Hiç yazılmamış ya da kaldırılmış. "Boş olarak yazılmış" ile aynı şey değil.
}
```

## Tuzaklar

> **set'in üçüncü argümanı adının tersini yapar**
> 
> Varsayılanında bırakılırsa özyinelemeli olarak değiştirir, yani iç içe bir anahtarın altındaki kardeşler yaşamaya devam eder. True geçmek yalnız en üst seviyede birleştirir; bu da iç içe bir diziyi bütün olarak değiştirir ve adını anmadığınız anahtarları düşürür. Bir grubun altındaki tek anahtarı değiştirmek varsayılan davranıştır, birleştiren davranış değil.

> **Bellekte değiştirmek kalıcı kılmaz**
> 
> Ayarlayıcı ile kaydedici bilerek ayrıdır; böylece bir istek dosyayı yeniden yazmadan kendisi için bir ayarı geçersiz kılabilir. Bir değişikliğin isteği aşması gerekiyorsa kaydedin; veri argümanı verilmeden yapılan kayıt, ayarlayıcının bellekte bıraktığı neyse onu işler.

> **Yapılandırma dosyası derlenen PHP'dir**
> 
> Sunucu derlenmiş bir kopyayı tutup dosya değiştikten sonra da sunmaya devam edebilir; kayıt başarılı görünür ve eski değer bir sonraki sayfada geri gelir. O kopyayı geçersiz kılan dosya yöneticisiyle yazın; ham yazma bunu kendi yapmak zorundadır.

> **Yapılandırma kurulum genelidir**
> 
> Herkes için tek bir değer vardır. Kişisel bir tercihi buraya koymak, onu değiştiren ilk operatörün diğer bütün operatörler için de değiştirmesi demektir; o tür bir değer çereze ya da kullanıcı kaydına aittir.

## İlgili Makaleler

- [Utility Yardımcıları](https://dev.wisecp.com/tr/utility-yardimcilari)
- [Modül Yapılandırması](https://dev.wisecp.com/tr/modul-yapilandirmasi)
- [Önbellek](https://dev.wisecp.com/tr/onbellek)
- [Geliştirme Ortamı Kurulumu](https://dev.wisecp.com/tr/gelistirme-ortami-kurulumu)
