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.
runkomutu--applyverilmedikçe hiçbir şey yazmaz; ne yapacağını raporlar. - Idempotenttir. Her satırın
sourceId'si bir eşleme tablosuna (migration_id+source_idbenzersiz) yazılır. Aynı taşımayı yeniden çalıştırmak kopya üretmez; yalnızca değişmiş satırları günceller (her satırınchecksum()'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;
rollbackyazı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) |
--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.