æè¿ãSergey Prokhorovå¥å
proxyfabioã¯èšäº
Validation of objects + transactionãæžããŸããã ãã®ãããã¯
ã«ã€ããŠã¯ãããã§å°ã
説æããŸãã ã ãã®ãããã¯ã¯éåžžã«éèŠã§ãããä»æ¥ãMODX Revolutionã§ã®å€§èŠæš¡ãããžã§ã¯ãã®éçºã«ãããæãéèŠãªåé¡ã®1ã€ã§ããããšãèªåã§ä»ãå ããããšæããŸãã
ããã§ã¯ãã倧èŠæš¡ãªãããžã§ã¯ããå®è¡ããŠããå ŽåãMODXã§ããããå®è¡ããªãã§ãã ãããäœãšãäœãšãããŠãã ããããã®ãããªããšãå§ããªãããã«ããã«ãé¡ãããŸãã MODXã ãã§ãªãã倧èŠæš¡ãªãããžã§ã¯ããè¡ããŸããã MODXã§å€§èŠæš¡ãªãããžã§ã¯ããäœæããããšã¯éåžžã«å¯èœã§ããçŸåšãåã
ã®ãããžã§ã¯ãã§æ±ºå®ããŠãã匱ç¹ã¯2ã3ã ãã§ãããã以å€ã®å ŽåãMODXã¯å€§èŠæš¡ãããžã§ã¯ãã®éçºã«98ïŒ
é©ããŠããŸãã ãããã£ãŠããããã®æ·±å»ãªåé¡ã®1ã€ã¯ãxPDOObject :: saveïŒïŒã¡ãœããïŒxPDOãªããžã§ã¯ãã®ä¿åæã«åŒã³åºãããïŒã«é¢é£ããŠããŸãã ãã®åé¡ã®æ¬è³ªã¯ãå
éšã§é¢é£ãªããžã§ã¯ãxPDOObject :: _ saveRelatedObjectsïŒïŒã
2åä¿åããã¡ãœãã
ãããªã¬ãŒãããããšã§ãã
1 ã€ãš2〠ã ããã¯ããããã®é¢é£ãªããžã§ã¯ãã®ãã©ã€ããªããŒãšã»ã«ã³ããªããŒãèšå®ããããã«è¡ãããŸãïŒIlya Utkinã®
åèè³æã
åç
§ ïŒã äŸã§ããã«è©³ãã説æããŸãã ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
<?php $user_data = array( "username" => "test", ); $profile_data = array(); $user = $modx->newObject('modUser', $user_data); $user->Profile = $modx->newObject('modUserProfile', $profile_data); $user->save(); print '<pre>'; print_r($user->toArray()); print_r($user->Profile->toArray());
äžè¬ã«ã確ãã«ããã®ã³ãŒãã®æ¬è³ªã¯å€ãã®äººã«æããã§ããã詳现ã«çŠç¹ãåœãŠãŸãããã 2ã€ã®æ°ãããªããžã§ã¯ãïŒ$ userãš$ user-> ProfileïŒãäœæãããšãããããã¯ä¿åããããŸã§èå¥åãæã¡ãŸããã ãã ãã$ userãªããžã§ã¯ãã®ã¿ãä¿åãããšãä¿åããã$ user-> Profileãªããžã§ã¯ããååŸãããŸãã ããã¯ãããã§ãã£ãããã«ãçç±ãç解ã§ããŸããã€ãªã€ã¯åœŒã®èšäºã§ããããã¹ãŠèª¬æããŸãã ããããããŸãã«ãã質åã¯ããxPDOã¯ã©ã®ããã«ãidã$ modx-> Profile-> internalKeyãšããŠå²ãåœãŠãããã«$ userãªããžã§ã¯ããã©ã®IDã§ãããããã©ã®ããã«ç¥ã£ãŠããã®ããã§ãã ãããè¡ãã«ã¯ãxPDO :: saveïŒïŒã¡ãœããã®ã³ãŒããããäžåºŠèŠãŠã¿ãŸãããã
ããã§ã¯
ã$ user-> _ saveRelatedObjectsïŒïŒã¡ãœããã®
æåã®åŒã³åºãããããŸã ã ãã®æç¹ã§ã¯ã$ãŠãŒã¶ãŒãªããžã§ã¯ãã¯ãŸã ä¿åãããŠãããïŒããŒã¿ããŒã¹ã«æžã蟌ãŸããŠããŸããïŒããŸã IDããããŸããã $ user-> Profileãä¿åããããidãinternalKeyããããŸããã $ user-> _ saveRelatedObjectsïŒïŒã¡ãœããã®åŒã³åºããèŠããšã
é¢é£ãªããžã§ã¯ãã
åæããã³
ä¿åã
ããŠããããšãããã
ãŸã ïŒxPDO :: _ saveRelatedObjectïŒïŒã¡ãœããïŒã ããã§ã$ user-> Profileãªããžã§ã¯ããé¢é£ä»ããããŠãã$ userãªããžã§ã¯ããä¿åããŠããããšãããäžåºŠæ確ã«ããŸãã ãããŠãå®éã«ã¯ã$ user-> Profileãªããžã§ã¯ãã¯$ userãªããžã§ã¯ããããåã«ä¿åãããããšãããããŸãã ãªãã§ïŒ åŒã³åºãã§$ user-> _ saveRelatedObjectïŒ$ user-> ProfileïŒ
ã¡ãœãã$ user-> Profile-> saveïŒ ïŒã
åŒã³åºãã ãçŸåš$ user-> Profileã«é¢é£ãããªããžã§ã¯ãããªããããæžã蟌ãŸããŸãããŒã¿ããŒã¹ã«ã ãããŠãããã§äœãåŸãã®ã§ããããïŒ $ user->ãããã¡ã€ã«ã¯ãã§ã«ä¿åãããŠãããç¬èªã®idãæã£ãŠããŸããã$ userãªããžã§ã¯ãã«ã¯idããããŸããïŒãŸã ä¿åãããŠããªãããïŒã ãã®ãããã»ã«ã³ããªããŒ$ user-> Profile-> internalKeyã¯ãŸã 空ã§ãã
OKãç§ãã¡ã¯ãããç解ããŸãããç§ãã¡ã¯ç¶ããŠããŸãã ãããŠã$ãŠãŒã¶ãŒãªããžã§ã¯ãèªäœãä¿åããããŒã¿ããŒã¹ã«æžã蟌ã¿ãIDãå²ãåœãŠãŸãã 以äžã§ãèšé²ã¯å®äºã§ãã ããã§äž¡æ¹ã®id-shnikiãã§ããŸãããããŸã $ user-> Profile-> internalKeyã®å€ã¯ãããŸããã ããã¯ããŸãã«
$ user-> _ saveRelatedObjectsïŒïŒã¡ãœãããããäžåºŠåŒã³åºããããã®ã§ãã ããã§ãé¢é£ä»ãããã$ user-> Profileãªããžã§ã¯ããä¿åããããšã$ user-> idã®å€ãååŸãã$ user-> Profile-> internalKeyãšããŠå²ãåœãŠãŠä¿åã§ããããã«ãªããŸãã
ã¯ããç§ã¯ããããã¹ãŠãéåžžã«çŽããããããšã«åæããŸãïŒãããŠãç§ã¯ãããããã«ãã£ãšçŽãããããšèª¬æããŸãïŒãããã®ãã¹ãŠã«è«çããããŸãã ãããŠå®éããã®çç±ãããinnoDBã®ä»£ããã«MyIsamãæ°žç¶çã«äœ¿çšããŠããããšãããããŸãã ãªãã§ïŒ ã¯ããinnoDBã§ã¯å®å
šã«åäœããããšãã§ããªãããã§ãã ãããŠä»ãç§ãã¡ã¯ä»äºã®åçã§ã¯ãªããæ¢åã®åé¡ãåæããŸãã ãã®ãã¹ãŠãå®å
šã«ç解ããã«ã¯ãMySQLãååã«ç解ããå¿
èŠããããŸããã€ãŸãããã©ã³ã¶ã¯ã·ã§ã³ããã©ã€ããªããŒãå€éšããŒãªã©ãç解ããå¿
èŠããããŸãã
ããŒã¿ããŒã¹ãããã«æ£ããæ§æããŸããããã€ãŸããããŒã¿ããŒã¹èªäœã®ã¬ãã«ã§ãã©ã€ããªããŒãšã»ã«ã³ããªããŒãæ§æããŸãã ãããè¡ãã«ã¯ã次ãå®è¡ããŸãã
1.ããŒãã«ãinnoDBãšã³ãžã³ã«è»¢éããŸãããã 2. modx_usersããŒãã«ã§ã¯ãidãã£ãŒã«ãã¯intïŒ10ïŒunsignedã§ãããmodx_users_attributesã§ã¯ãinternalKeyãã£ãŒã«ãã¯intïŒ10ïŒïŒunsignedã§ã¯ãããŸããïŒã§ãã ãã®ãããäž¡æ¹ã®ããŒãã«ã®åã®ããŒã¿åãå®å
šã«äžèŽããå¿
èŠããããããã»ã«ã³ããªããŒãåçŽã«æ§æããããšã¯ã§ããŸããã
3ã»ã«ã³ããªããŒãäœæãã ã»ã«ã³ããªããŒã®ä¿åäžã«ãšã©ãŒãçºçããªãã£ãå Žåã¯ããã°ãããã§ãïŒ ããããããªããåŸããããããªãããã€ãã®ééãããããŸãã æãäžè¬çãªãã®ã¯æ¬¡ã®ãšããã§ãã
1.ããŒã¿åãäžèŽããŸããã
2.ã»ã«ã³ããªã¬ã³ãŒãã®å Žåããã©ã€ããªã¬ã³ãŒãã¯ãããŸããïŒããšãã°ãinternalKey = 5ã®modx_user_attributesã«ã¬ã³ãŒãããããŸãããid = 5ã®modx_usersã«ã¯ã¬ã³ãŒãããããŸããïŒã
次ã«ãåé¡ã®æ¬è³ªãäŸã§èŠãŠã¿ãŸãããã ãããè¡ãã«ã¯ã
ã³ã³ãœãŒã«ã§æ¬¡ã®ã³ãŒããå®è¡
ããŸãã
<?php $user_data = array( "username" => "test_". rand(1,100000), ); $profile_data = array( "email" => "test@local.host", ); $user = $modx->newObject('modUser', $user_data); $user->Profile = $modx->newObject('modUserProfile', $profile_data); $user->save(); print '<pre>'; print_r($user->toArray()); print_r($user->Profile->toArray());
ããã§åé¡ã¯çºçããŠããŸããããã¹ãŠã³ã¡ã³ããªãã§ä¿åãããŸããã
æåæã®ãµã³ãã«åºå Array ( [id] => 59 [username] => test_65309 [password] => [cachepwd] => [class_key] => modUser [active] => 1 [remote_key] => [remote_data] => [hash_class] => hashing.modPBKDF2 [salt] => [primary_group] => 0 [session_stale] => [sudo] => ) Array ( [id] => 54 [internalKey] => 59 [fullname] => [email] => test@local.host [phone] => [mobilephone] => [blocked] => [blockeduntil] => 0 [blockedafter] => 0 [logincount] => 0 [lastlogin] => 0 [thislogin] => 0 [failedlogincount] => 0 [sessionid] => [dob] => 0 [gender] => 0 [address] => [country] => [city] => [state] => [zip] => [fax] => [photo] => [comment] => [website] => [extended] => )
ããã§ã¯ãã³ãŒããå°ãå€æŽããŸãããã
<?php $user_data = array( "username" => "test_". rand(1,100000), ); $profile_data = array( "email" => "test@local.host", ); $user = $modx->newObject('modUser', $user_data); $user->Profile = $modx->newObject('modUserProfile', $profile_data);
ãã®ã³ãŒããå®è¡ãããšã©ããªããŸããïŒ
1. SQLãšã©ãŒã¡ãã»ãŒãž
Array ( [0] => 23000 [1] => 1452 [2] => Cannot add or update a child row: a foreign key constraint fails (`shopmodxbox_test2`.`modx_user_attributes`, CONSTRAINT `modx_user_attributes_ibfk_1` FOREIGN KEY (`internalKey`) REFERENCES `modx_users` (`id`)) )
2.äž¡æ¹ã®ãªããžã§ã¯ãã¯ãŸã ä¿æãããŠãããæ£ããidãšinternalKeyãæã£ãŠããŸãã
ãªããããèµ·ãã£ãŠããã®ã§ããïŒ ã»ã«ã³ããªãªããžã§ã¯ããä¿åãããšããxPDO
ã¯ãã©ã€ããªããŒå€ãååšãããã©ããã確èªããååšããå Žåã®ã¿ããã®å€ãã»ã«ã³ããªããŒãšããŠæ¢ã«èšå®ãããã®ãªããžã§ã¯ããä¿åããŸãã ãã®å Žåããã©ã€ããªããŒIDãšã»ã«ã³ããªãªããžã§ã¯ããæåã§æå®ããŠå€ãååŸããããŒã¿ããŒã¹ãžã®æžã蟌ã¿ãè©Šã¿ãŸããããå®éã«ã¯ãã©ã€ããªã¬ã³ãŒãããªãããããã©ã€ããªãªããžã§ã¯ããªãã§ã¯ã»ã«ã³ããªã¬ã³ãŒããæžã蟌ãããšãã§ããªããšããSQLãšã©ãŒãçºçããŸãã ããããäž»èŠãªãªããžã§ã¯ãã®ä¿åã¯ããã§æ¢ãŸããŸããã ãã®åŸããã©ã€ããª$ userãªããžã§ã¯ããããŒã¿ããŒã¹ã«æ£åžžã«æžã蟌ãŸããé¢é£ä»ãããã$ user-> Profileãªããžã§ã¯ããå床ä¿åããããšãããšããã©ã€ããªã¬ã³ãŒããããããããã¹ãŠãéåžžä¿åãããŸãã
ããããã¹ãŠããã2ã€ã®çµè«ãå°ãããŸãã1.é¢é£ãªããžã§ã¯ããä¿åããå Žåãã»ã«ã³ããªãªããžã§ã¯ãã®ä¿åäžã®ãšã©ãŒã远跡ããäœããã®æ¹æ³ã§ãããã«åå¿ããããšã¯ã§ããŸããã ã€ãŸããã»ã«ã³ããªãªããžã§ã¯ããä¿åãããªãã£ãçç±ïŒãã©ã€ããªãªããžã§ã¯ãããŸã ãªããã©ãããxPDOObject :: _ saveRelatedObjectsïŒïŒã¡ãœãããå床åŒã³åºããããšãããŸãã¯ããã§äžæã®ããŒãã¯ã©ãã·ã¥ãããã©ãããååãšããŠããããã¬ãã«ã§ã®æ€èšŒã«åæ Œããªãã£ããã©ãããªã©ãèšé²ãèšé²ããããšã¯ã§ããŸããïŒã
2.ãã®ããããã©ã³ã¶ã¯ã·ã§ã³ãå®å
šã«äœ¿çšããããšã¯äžå¯èœã§ãã
ãã®åé¡ã解決ããå¯èœãªæ¹æ³ãé¢é£ãªããžã§ã¯ãã®ã¿ã€ãã«å¿ããŠãxPDOObject :: _ saveRelatedObjectsïŒïŒã¡ãœããã®1åç®ãš2åç®ã®åŒã³åºããåºå¥ããããšã§ããã®åé¡ã®è§£æ±ºçãããããŸããã€ãŸããæåã®åŒã³åºãã¯ãã©ã€ããªãªããžã§ã¯ãã2çªç®ã®åŒã³åºãã¯ã»ã«ã³ããªã§ãã ãã®å ŽåãããŒãšã®æ··åã¯çµ¶å¯Ÿã«ãããŸããããªããžã§ã¯ããäœããã®çç±ã§ä¿åãããªãã£ãå Žåãããã¯ééããªããšã©ãŒãæå³ããä¿åããã»ã¹ïŒãã©ã³ã¶ã¯ã·ã§ã³ã®ããŒã«ããã¯ãå«ãïŒãäžæããããšãå¯èœã«ãªããŸãã