İçeriğe geç

Veri tasima migrate


title: Veri taşıma (Migrate API) description: Başka bir sistemden CPalius'a veri taşımanın çekirdek mimarisi: kaynak, hedef, dönüşüm, idempotentlik, geri alma ve komut satırı.

CPalius'a başka bir CMS'ten ya da CSV'den içerik taşımak, çekirdeğin Migrate API'siyle yapılır. Çekirdek yalnızca motoru ve hedefleri taşır; WordPress, XenForo, MyBB, Joomla gibi kaynaklara özel kod İçe Aktarıcı modülündedir (Modül Belgeleri'nde ayrıca anlatılır). Bu sayfa motorun nasıl çalıştığını anlatır; kendi taşıma işinizi yazacaksanız buradan başlayın.

Dört kavram

Kavram Arayüz Görevi
Taşıma MigrationInterface Bir taşıma işi: kimliği, etiketi, bağımlılıkları, kaynağı, hedefi ve dönüşümü
Kaynak MigrationSourceInterface rows() ile satırları sırayla verir, count() ile toplamı söyler
Hedef MigrationDestinationInterface write() ile bir satırı CPalius'a yazar, delete() ile geri alır
Satır MigrationRow Boş olmayan bir sourceId ve veri dizisi

Çekirdekte hazır hedefler: NodeDestination (içerik), TermDestination (sözlük terimi), UserDestination (kullanıcı), AssetDestination (medya). Hazır kaynaklar: CsvSource, DatabaseSource (başka bir veritabanından, salt okunur).

MigrationInterface uygulayan sınıf cpalius.migration etiketini otomatik alır.

Taşımayı güvenli yapan kurallar

  • Varsayılan kuru çalıştırmadır. run komutu --apply verilmedikçe hiçbir şey yazmaz; ne yapacağını raporlar.
  • Idempotenttir. Her satırın sourceId'si bir eşleme tablosuna (migration_id + source_id benzersiz) yazılır. Aynı taşımayı yeniden çalıştırmak kopya üretmez; yalnızca değişmiş satırları günceller (her satırın checksum()'u karşılaştırılır).
  • Satır yalıtımlıdır. Bir satırın hatası taşımayı durdurmaz; rapora yazılır, sonrakine geçilir.
  • Bağımlılık sıralıdır. dependsOn() ile "önce kullanıcılar, sonra yazılar" tanımlanır; motor topolojik sırayla çalıştırır.
  • Akışkandır. Kaynaklar belleği doldurmadan satır satır (XMLReader, anahtar kümesi sayfalama) okur.
  • Geri alınabilir. Eşleme, hedefe başarıyla yazıldıktan sonra kaydedilir; rollback yazılanları eşleme üzerinden siler.

Komut satırı

php cp-core/bin/console cp:migrate list                       # tanımlı taşımalar
php cp-core/bin/console cp:migrate status wordpress.posts     # durum ve kabul ettiği seçenekler
php cp-core/bin/console cp:migrate run wordpress.posts -o file=/yol/export.xml          # KURU ÇALIŞTIRMA
php cp-core/bin/console cp:migrate run wordpress.posts -o file=/yol/export.xml --apply  # gerçekten yaz
php cp-core/bin/console cp:migrate run --apply                # hepsini bağımlılık sırasıyla
php cp-core/bin/console cp:migrate rollback wordpress.posts --apply
Seçenek Anlamı
--apply Yazmayı açar; olmadan run ve rollback yalnızca raporlar
--limit=N İlk N kaynak satırından sonra durur (deneme için)
-o ad=değer Taşımaya seçenek verir; birden çok kez yazılabilir
--json Makine okunur çıktı (CI için)
Önce küçük deneyin

--limit=20 ile kuru çalıştırın, raporu okuyun, sonra --apply ile aynı 20 satırı yazın, sonucu panelde görün. Beğendiyseniz limitsiz çalıştırın; idempotentlik sayesinde ilk 20 kopyalanmaz.

Kendi taşımanızı yazmak

final class EskiSiteHaberleri implements MigrationInterface
{
    public function id(): string { return 'eskisite.haberler'; }
    public function label(): string { return 'Eski site haberleri'; }
    public function dependsOn(): array { return ['eskisite.kullanicilar']; }
    public function source(): MigrationSourceInterface { /* DatabaseSource ya da CsvSource */ }
    public function destination(): MigrationDestinationInterface { /* NodeDestination */ }

    public function transform(MigrationRow $row): ?MigrationRow
    {
        // null döndürmek satırı atlar
        return $row->withData([...$row->data, 'type' => 'post', 'status' => 'published']);
    }
}

transform() düz PHP'dir; null satırı atlar, bir MigrationRow hedefe gider. Seçenek kabul etmek isteyen taşıma ConfigurableMigrationInterface uygular.

Dürüst bir uyarı

Hazır sürücüler (WordPress, XenForo, MyBB, Joomla) gerçek kurulumlara değil, test veri kümelerine karşı sınanmıştır. Gerçek bir siteyi taşırken her zaman kuru çalıştırma, küçük limit ve yedek ile başlayın; sürücülerin tuhaflıkları (MyBB'nin linkto ve closed alanları, Joomla'nın rastgele tablo öneki ve iç içe küme kökü, bölünmüş makale gövdeleri) gerçek verilerde ortaya çıkar.

Son güncelleme: 13.10.2026