Güncellemeye Dayanıklı Çalışma İlkeleri
Bir sonraki çekirdek yükseltmesinden sonra kodunuzun çalışmaya devam edip etmeyeceğine karar veren altı kural. Her biri, yükseltme koşusunun bir dosyaya ne yaptığına bağlıdır.
Genel Bakış
Güncellemeye dayanıklılık bir üslup değil, ölçülebilir bir özelliktir. Yükseltme koşusu sürümün dosyalarını sistemin üzerine kopyalar, sürümün adını verdiği yolları siler, geri kalan her şeye dokunmaz. İşinizin hangi kovaya düştüğü sağ çıkıp çıkmayacağını belirler. Kovayı, kodu nereye koyacağınıza karar verirken siz seçersiniz.
Koşu incelenebilir. Adımları koşucu sınıfında bir sabittir ve her üzerine yazma işleminden önce dosyanın kopyası kenara alınır. Geri alınamayan iki şey adıyla yazılır.
Özelliğin ikinci yönü şudur: kodunuzun, yer değiştirmiş bir çekirdeğe karşı da çalışmaya devam etmesi gerekir. Dinlediğiniz bir kanca yeniden adlandırılabilir. Çağırdığınız bir metodun imzası değişebilir, içine bastığınız bir şablon yeniden yazılabilir. Aşağıdaki son kural, bu varsayımların hâlâ geçerli olduğunu kanıtlamakla ilgilidir.
Ön Koşullar
- Sisteme kabuk erişimi ya da en azından
coremio/VERSIONdosyasını ve panelin güncelleme ekranını okuyabilme imkânı. - Genişleme noktalarının kabaca haritası:
hooks/INDEX.md,coremio/modules,templates/website. - Kanca kelimesi henüz somut bir şey ifade etmiyorsa önce Kancalar Nasıl Çalışır makalesini okuyun.
Yapı
Bir Yükseltme Gerçekte Neye Dokunur
Uygulama adımı, paketin kendi dosya ağacından tek bir liste kurar ve her girdiyi sistemin üzerine kopyalar. Başka hiçbir yere uğramaz; silmeler ayrı ve açık bir bildirim dosyasıyla yürür.
| Dosya nerede | Koşu ona ne yapar | Sizin için anlamı |
|---|---|---|
| Sürümün getirdiği bir çekirdek dosyası (sınıf, helper, controller, admin şablonu) | Koşu öncesi kopyası saklandıktan sonra bayt bayt üzerine yazılır | Düzenlemeleriniz gider. Saklanan kopya bir önceki sürümü geri getirir, sizin düzenlemenizi değil |
| Sürümün silme bildiriminde adı geçen bir yol | Koşu öncesi kopyası saklandıktan sonra silinir | Yeniden adlandırma, ekleme artı silme olarak gönderilir; kod bağladığınız bir dosya ortadan kalkabilir |
coremio/configuration, dosya zaten varsa | Atlanır | Düzenlemeleriniz yaşar, bayat varsayılanlar da: yeni sürümün oraya eklediği anahtarlar hiç gelmez |
coremio/locale | Anahtar anahtar birleştirilir, çakışmada gelen kazanır | Eklediğiniz bir anahtar yaşar. Yeniden yazdığınız bir çekirdek metni, sürüm o anahtarı gönderdiği an geri gelir |
coremio/storage | Silme bildirimi bu yolları reddeder, asla kaldırmaz | Çalışma zamanı verisi sizindir |
| Paketin ne gönderdiği ne de adını verdiği bir yol | Dokunulmaz, kenara bile kopyalanmaz | Modülünüz, kanca dosyanız ve temanız burada yaşar |
Altı Kural
coremio/hooks altındaki her dosya ve bir modül dizinindeki her hooks.php açılışta otomatik olarak dahil edilir. Davranış eklemek size değişmiş bir dosyaya değil, yeni bir dosyaya mal olur.
config.php dosyası ya da veritabanı destekli ayar çifti. Asla bir çekirdek yapılandırma dosyası değil: koşu onu atlar; sonraki bir sürümün oraya eklediği anahtarlar size hiç ulaşmaz.
Genişleme Noktası Sınıfları
Her birinin kendi makalesi var. Burada önemli olan şekil: beş tür genişleme noktası, her biri farklı bir maliyet ve farklı bir sınırla.
Referans
Her Güvenli Değişikliğin Geçtiği İlkel Yapılar
// coremio/classes/Hook.php - yayımlanmış bir noktaya bağlanma.
public static function add($name, $priority, $properties = []): void;
public static function run($name, ...$args): array;
public static function runRefs($name, &...$args): array;
// coremio/classes/Config.php - dosyada değil veritabanında yaşayan ayarlar.
public static function getd($name = '');
public static function setd($name = '', $content = '');
// coremio/classes/Config.php - DOSYA tarafı. Serbestçe okuyun, yalnız kendi dosyanıza yazın.
public static function get($arg = NULL);
public static function save($name = '', $data = []): bool;
// coremio/classes/Modules.php - bir modül örneğini almanın kanonik yolu.
public static function getInstance(string $type, string $name, array $params = []): ?object;
// coremio/helpers/license.php - coremio/VERSION dosyasından okunan, çalışan çekirdek sürümü.
public static function version($realtime = false): string;
configurations tablosundan tek bir satır okur. Saklanan değeri döner; ad hiç yazılmamışsa boş bir sonuç verir. Araya dosya girmez.
coremio/configuration altındaki bir dosyaya eğik çizgiyle adreslenen, ilk dokunuşta yüklenen okuma. Config::get("general/cache") önce general.php dosyasını, sonra cache anahtarını okur. Olmayan anahtar null değil false döner.
coremio/VERSION dosyasını okur ve istek boyunca hatırlar. true geçmek bu hatırlamayı atlar, ki bu yalnız bir yükseltme koşusunun içinde önemlidir. Karşılaştırmayı version_compare() ile yapın, dize olarak asla.
new yazmak beşini birden atlar.
Bir Kayıt Dosyasının Yaşamasına İzin Verilen Yerler
İstek başına bir kez değerlendirilen iki glob, nelerin dahil edileceğine karar verir. Onların dışındaki her şeye, onların içinden ulaşmak gerekir.
| Desen | Ne zaman yüklenir | Ne için kullanılır |
|---|---|---|
coremio/hooks/*.php | Bir kanca ilk kez ateşlendiğinde, istek başına bir kez. Kanca kaydetmek bu geçişi tetiklemez | Yalnız bu sisteme ait davranışlar |
coremio/modules/{Tip}/{Ad}/hooks.php | Aynı geçiş, aynı dahil etme döngüsü | Modülle birlikte taşınan davranışlar |
coremio/modules/{Tip}/{Ad}/router.php | Modül bir admin alanı kaydettiğinde, admin yönlendirmesi sırasında | Admin paneli içindeki modül sayfaları |
coremio/cronjobs/*.php | Açılışta, sınıf taramasıyla: TYPE sabiti taşıyan sınıf kaydedilir | Çekirdeğin zamanlanmış görevleri. Modül kendi görevini hooks.php içinden kaydeder |
Kanca dizinine bırakılan bir dosya paket sistemine görünmez. Kimse onu güncellemez, sürümlemez ve işiniz emekliye ayrıldığında kaldırmaz. Birden çok sisteme gidecek davranış bir modül dizininde yaşamalıdır.
Örnek
Aynı gereksinim iki kez: bir ödeme yöntemine ek ücret, bir kez çekirdek düzenlenerek, bir kez genişleme noktasından.
// Bir çekirdek helper'ının içinde, sürümün sahibi olduğu bir metoda elle eklenmiş üç satır.
// Uygulama adımı bu dosyayı gönderir; kopyalama döngüsü üzerine yazar ve koşu öncesi kopya
// defteri düzenlemeyi değil ÖNCEKİ SÜRÜMÜ geri yükler. Neyin neden değiştirildiğine dair
// geriye hiçbir iz kalmaz.
if ($pmethod === 'wire-transfer')
$summary['total'] = (float) $summary['total'] + 2.50;
// Hiçbir sürümün adını anmadığı bir dizinde yeni bir dosya. Ne üzerine yazılır ne silinir.
// Kural 3: dinleyici bir kanca ADINA ve belgelenmiş parametre adlarına bağlanır.
// Kural 4: tutar, çekirdek dosyasındaki bir sabit değil, veritabanına dayalı bir ayardır.
Hook::add('filter:order.cart_totals', 20, function (&$summary, $items, $subtotal, $coupons, $ctx) {
$fee = (float) Config::getd('acme_wire_fee');
if ($fee <= 0) return;
$summary['total'] = (float) ($summary['total'] ?? 0) + $fee;
$summary['tax']['total'] = $summary['total'];
});
// Kural 6: iş denenmeden önce cevaplanan ve başarısızlık değil "ölçülmedi" diye
// bildirilen bir yetenek sorusu.
Hook::add('action:cron.day.run', 50, function () {
if (!function_exists('exec')) {
// Logger::log() önce bir seviye ister; seviye kısayolları yalnız mesajı alır.
Logger::info('acme: archive check skipped, exec() unavailable');
return;
}
// ... alt süreç gerektiren prob
});
Ve aynı dosyayı, kendisi için yazılmadığı bir çekirdekte sessiz tutan kapı.
// version_compare, asla dize karşılaştırması değil: metin olarak "2.10.0", "2.4.0"'ın ALTINDA kalır.
if (version_compare(License::version(), '5.0.0', '<')) return;
// Aynı kapının diğer yarısı: çağırmak üzere olduğunuz metot orada olmayabilir.
// method_exists hiçbir maliyet çıkarmaz ve ölümcül bir hatayı kapalı bir özelliğe çevirir.
if (!method_exists('Checkout', 'payment_methods')) return;
Tuzaklar
Uygulama döngüsü zaten var olan bir yapılandırma dosyasını atlar, yani düzenlemeniz yaşar. İlk kurduğunuz sürümün varsayılanları da yaşar. Sürümün oraya eklediği anahtarlar hiç teslim edilmez ve onları okuyan özellik, operatör kapatmış gibi davranır.
Dil dosyaları değiştirilmez, birleştirilir ve gönderdiği her anahtarda gelen sürüm kazanır. Eklediğiniz bir anahtar yaşar; yeniden yazdığınız bir çekirdek metni, çekirdek tarafında o anahtara ilk dokunulduğunda geri gelir. Kendi anahtarınızı ekleyin ve kendi kodunuzu ona bağlayın.
Sürüm, kaldırılacak yolların açık bir listesini taşır; yeniden adlandırma böyle ifade edilir. Kodunuz bir çekirdek dosyasının içinde yaşıyorsa, o dosyayı yeniden adlandıran bir yükseltme hiçbir şeyin üzerine yazmadan işinizi kaldırır. Genişlettiğiniz sınıf aynı anda var olmayı bırakır.
Koşu öncesi kopya defteri üç koşu saklar ve içinde yalnız sürümün dokunduğu dosyalar bulunur. Bu, kötü bir yükseltmeden dönüş yoludur, özelleştirmelerinizin arşivi değil. Koşudan önce alınmış bir yedeğin yerini tutmaz.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.