UXDMは、開発者があるシステムまたはフォーマットから別のシステムにデータを移行するのに役立ちます。

UXDMは、Composerを使用して簡単にインストールできます。プロジェクトのルートから次のコマンドを実行するだけです。
composer require divineomega/uxdm
以前にComposer Dependency Managerを使用したことがない場合は、Composer Webサイトにアクセスして、開始方法の詳細をご覧ください。
UXDM移行コードを含む新しいPHPファイルを作成します。この例では、 user-csv-import.phpと呼びます。必要にrequire 'vendor/autoload.php'と関連するuseステートメントを追加することを忘れないでください。
ソースおよび宛先オブジェクトを作成します。この例では、CSVソースとPDO(データベース)宛先を使用しています。
$ csvSource = new CSVSource ( ' users.csv ' );
$ pdoDestination = new PDODestination ( new PDO ( ' mysql:dbname=test-database;host=127.0.0.1 ' , ' root ' , ' password ' ), ' users ' ); $ migrator = new Migrator ;
$ migrator -> setSource ( $ csvSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> withProgressBar ()
-> migrate ();php user-csv-import.phpを実行するだけで、素晴らしい進行状況バーを取得できます。利用可能なソースおよび宛先オブジェクトの詳細、およびより高度な使用例については、以下のセクションを参照してください。
各UXDM移行には、ソースオブジェクトと少なくとも1つの宛先オブジェクトが必要です。これらは、データがどこでどのように読み取られ、どのように書き込まれるかを決定します。 UXDMパッケージは、以下を含むさまざまなソースおよび宛先オブジェクトで動作します。
これらのいくつかは、コアUXDMパッケージに組み込まれていますが、他のパッケージは個別のパッケージとして入手できます。
ソースおよび宛先オブジェクトは、任意の組み合わせで使用できます。データをデータベースからCSVに移行できるのと同じくらい簡単に、データをCSVから移行してデータベースに挿入できます。
同じ移行で同様のソースオブジェクトと宛先オブジェクトを使用することもできます。たとえば、UXDMの一般的な使用は、PDOソースとPDO宛先を使用して、あるデータベースから別のデータベースにデータを転送することです。
より多くのソースと目的地、およびそれらの使用に関する詳細なドキュメントについては、ソースと宛先のページをご覧ください。
データベースに対する基本的なデータベースの例を以下に示します。
$ pdoSource = new PDOSource ( new PDO ( ' mysql:dbname=old-test;host=127.0.0.1 ' , ' root ' , ' password123 ' ), ' users ' );
$ pdoDestination = new PDODestination ( new PDO ( ' mysql:dbname=new-test;host=127.0.0.1 ' , ' root ' , ' password456 ' ), ' new_users ' );
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> withProgressBar ()
-> migrate ();この移行により、 id 、 email 、およびnameフィールドがold-testデータベースのusersテーブルから、 new-testデータベースのnew_usersテーブルに移動し、既存のレコードを同じid (キーフィールド)に置き換えます。
UXDMを使用して、ソースデータを検証できます。検証が移行の途中で失敗した場合、移行は停止し、 ValidationExceptionがスローされます。ただし、 ->validateBeforeMigrating()が呼び出された場合、すべてのデータ行は、移行が開始される前に先制的に検証されます。
以下のコードは、さまざまなフィールドを検証する方法を示しています。
$ pdoSource = new PDOSource ( new PDO ( ' mysql:dbname=old-test;host=127.0.0.1 ' , ' root ' , ' password123 ' ), ' users ' );
$ pdoDestination = new PDODestination ( new PDO ( ' mysql:dbname=new-test;host=127.0.0.1 ' , ' root ' , ' password456 ' ), ' new_users ' );
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setValidationRules ([
' id ' => [ new Required (), new IsNumeric ()],
' email ' => [ new Required (), new IsString (), new IsEmail ()],
' name ' => [ new Required (), new IsString ()],
])
// ->validateBeforeMigrating()
-> setKeyFields ([ ' id ' ])
-> withProgressBar ()
-> migrate ();この移行により、ソースデータが定義された検証ルールと一致することが検証されます。
UXDMは、Omega Validatorパッケージを使用します。利用可能なすべての検証ルールについては、そのドキュメントを参照してください。
この例は、UXDMがソースから宛先にフィールド名をマッピングする方法を示しています。
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> setFieldMap ([ ' name ' => ' full_name ' ])
-> withProgressBar ()
-> migrate ();この移行により、データをソースnameフィールドから宛先full_nameフィールドに移動し、 idとemailフィールドを正常に移動します。
場合によっては、ソースから宛先に移動したいデータが変換されます。これにより、既存のデータ項目を変更したり、新しいデータ項目を追加したり、不要なアイテムを削除したりする可能性があります。
UXDMを使用すると、1つ以上のトランスオブジェクトを作成し、移行に追加できます。トランスを使用してデータを操作する方法の次の例をご覧ください。
この例は、移行中に既存のデータ項目を変換する方法を示しています。
class NameCaseTransformer implements TransformerInterface
{
public function transform ( DataRow $ dataRow ): void
{
$ nameDataItem = $ dataRow -> getDataItemByFieldName ( ' name ' );
$ nameDataItem -> value = ucwords ( strtolower ( $ nameDataItem -> value ));
}
}
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> addTransformer ( new NameCaseTransformer ())
-> withProgressBar ()
-> migrate ();この移行により、すべての名前フィールドが一貫したケースを持つことが保証されます。
この例は、移行が行われている間に新しいデータ項目を追加する方法を示しています。
class AddRandomNumberTransformer implements TransformerInterface
{
public function transform ( DataRow & $ dataRow ): void
{
$ dataRow -> addDataItem ( new DataItem ( ' random_number ' , rand ( 1 , 1000 )));
}
}
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> addTransformer ( new AddRandomNumberTransformer ())
-> withProgressBar ()
-> migrate ();この移行により、データの各行のrandom_numberと呼ばれるフィールドに乱数が追加されます。これは、他のフィールドとともに宛先データベースに移行されます。
この例は、データ項目をデータ行から削除する方法を示しています。その価値を使用したい場合は、これを行うことをお勧めしますが、実際には目的地に移行することはありません。
class EmailToHashTransformer implements TransformerInterface
{
public function transform ( DataRow $ dataRow ): void
{
$ emailDataItem = $ dataRow -> getDataItemByFieldName ( ' email ' );
$ dataRow -> addDataItem ( new DataItem ( ' email_hash ' , md5 ( $ emailDataItem -> value )));
$ dataRow -> removeDataItem ( $ emailDataItem );
}
}
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> addTransformer ( new EmailToHashTransformer ())
-> withProgressBar ()
-> migrate ();この移行は、ソース内のemailフィールドからデータを取得し、電子メールアドレスのMD5を含む新しいemail_hashデータ項目を作成し、元のemailデータ項目を削除します。この新しいemail_hash 、削除されたemailフィールドを除く、他のフィールドとともに宛先データベースに移行されます。