PHP‚É‚¨‚¯‚é—áŠOƒNƒ‰ƒX‚̐݌vlŽ@

Posted by Hiraku on 2017-12-02

‚±‚Ì‹LŽ–‚ÍPHP Advent Calendar 2017‚Ì2“ú–Ú‚Å‚·B

‚±‚±Å‹ßA–{‹Æ‚Ì‚Ù‚¤‚ªŽ€‚Ê‚Ù‚Ç–Z‚µ‚­A‚·‚Á‚©‚èƒuƒƒO‚ð‘‚¢‚Ä‚¢‚È‚©‚Á‚½@Hiraku‚Å‚·B

‚¾‚¢‚Ô‘O‚Ì‚±‚Æ‚Å‚·‚ªA¡”N‚ÌPHPƒJƒ“ƒtƒ@ƒŒƒ“ƒX•Ÿ‰ª‚Å—áŠO‚̘b‚ð‚µ‚Ä‚«‚Ü‚µ‚½B

‚±‚ÌŽž‚Ì”­•\‚Å‚Í—áŠO‚ÉŠÖ‚·‚éŠT—v‚ªŽå‚¾‚Á‚½‚̂ŁA—áŠOƒNƒ‰ƒX‚»‚Ì‚à‚̂̐݌v‚ɂ‚¢‚Ä•â‘«‚ð‘‚¢‚Ă݂邱‚Æ‚É‚µ‚Ü‚·B

—áŠO‚Ì‚ ‚鐢ŠEŠÏ

PHP7‚Å‚Í‚¢‚­‚‚©‚̃Gƒ‰[‚ª—áŠO‚Æ“¯‚¶‹““®‚ðŽ¦‚·‚悤‚É‚È‚èAƒGƒ‰[‚Å‚Í‚È‚­—áŠO‹@\‚ðŽg‚¤Œ¾Œê‚É—l•Ï‚í‚肵‚Ü‚µ‚½B

—áŠO‚Æ‚¢‚¤‚̂́A‚©‚È‚èN—ª«‚̍‚‚¢ŠT”O‚Å‚ ‚èA—áŠO‚Ì‚ ‚鐢ŠE‚ł͈ȉº‚Ì‘O’ñ‚É—§‚‚±‚Æ‚ªˆÃ–Ù‚Ì‚¤‚¿‚É‹­—v‚³‚ê‚Ü‚·B

  • ‚Ç‚±‚Å‚à—áŠO‚ª”­¶‚·‚é‰Â”\«‚ª‚ ‚é
  • —áŠO‚É‚æ‚Á‚Ä’†’f‚³‚ê‚Ä‚àAƒ\ƒtƒgƒEƒFƒA‚ª•s“KØ‚ȏó‘Ô‚É‚È‚ç‚È‚¢‚悤‚ɕۏ؂·‚é‚Ì‚ÍŠeƒvƒƒOƒ‰ƒ}‚̐ӔC(—áŠOˆÀ‘S)

‚½‚Æ‚¦‚΁AˆÈ‰º‚̊֐”‚Å—áŠO‚ª”­¶‚·‚é‰Â”\«‚ª‚ ‚é‚̂͂ǂ̍s‚Å‚µ‚傤‚©H

function createStruct(DateTimeImmutable $now): Struct {
    $obj = new Struct;    // 1s–Ú
    $obj->setNow($now);   // 2s–Ú
    return $obj->init();  // 3s–Ú
}

³‰ð‚Í1~3‘S‚Ä‚Å‚·B‚±‚ê‚ÍStructƒNƒ‰ƒX‚ª‚ ‚È‚½‚ÌŽè‚É‚æ‚Á‚ď‘‚©‚êA‘Sƒƒ\ƒbƒh‚Å—áŠO‚ðthrow‚µ‚Ä‚¢‚È‚¢‚Æ‚µ‚Ä‚à ”­¶‚·‚é‰Â”\«‚͏Á‚¦‚Ü‚¹‚ñB

‚à‚¤APHP‚ÍŒ¾ŒêŽ©‘Ì‚ª—áŠO‚ð“Š‚°‚邱‚Æ‚ª‚ ‚鐢ŠE‚É‚È‚Á‚Ä‚¢‚Ü‚·B—Ⴆ‚΃VƒOƒiƒ‹‚âAƒ†[ƒU[‚É‚æ‚郊ƒNƒGƒXƒg’†’f‚ȂǁB¡‚ÌŽd—l‚Å‚Í—áŠO‚Å‚Í‚È‚­‚Ä‚àA‚¢‚—áŠO‚É‚È‚Á‚Ä‚à‚¨‚©‚µ‚­‚È‚¢‚à‚Ì‚ª‚ ‚è‚Ü‚·B

‚»‚ê‚ɁA‚ ‚é“ú“Ë‘RAStructƒNƒ‰ƒX‚ª‘¼‚̃Nƒ‰ƒX/ƒ‰ƒCƒuƒ‰ƒŠ‚Ɉˑ¶‚·‚é‚悤‚ȃR[ƒh‚ɕύX‚³‚ꂽ‚Æ‚·‚é‚ƁAŽ©“®“I‚Ɉˑ¶æ‚̃Nƒ‰ƒX/ƒ‰ƒCƒuƒ‰ƒŠ‚ªthrow‚·‚é—áŠO‚ªŒp³‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚·B

‚±‚ñ‚Ȑ¢ŠE‚ł́Autry~catch‚Å‘S—áŠO‚𑨂¦‚Ä‹N‚±‚³‚È‚¢‚悤‚É‚·‚邼Iv‚Æ‚¢‚¤‚Ì‚ÍŒµ‚µ‚·‚¬‚Ü‚·B‚»‚¤‚Å‚Í‚È‚­AˆÈ‰º‚ð‘O’ñ‚É‚·‚é‚ׂ«‚Å‚·B

  • ‚Ç‚±‚Å‚à—áŠO‚ª”­¶‚·‚é‰Â”\«‚ª‚ ‚é
  • —áŠO‚É‚æ‚Á‚Ä’†’f‚³‚ê‚Ä‚àAƒ\ƒtƒgƒEƒFƒA‚ª•s“KØ‚ȏó‘Ô‚É‚È‚ç‚È‚¢‚悤‚ɕۏ؂·‚é‚Ì‚ÍŠeƒvƒƒOƒ‰ƒ}‚̐ӔC(—áŠOˆÀ‘S)

—áŠOˆÀ‘S‚ÉŠÖ‚µ‚Ä‚Í•Ÿ‰ª‚ÌŽ‘—¿‚ŏ‘‚¢‚½‚Ì‚Å‚»‚¿‚ç‚ðŽQÆ‚µ‚ĉº‚³‚¢B

PHP‚Åthrow‚Å‚«‚é‚à‚Ì

u‚Ç‚±‚Å‚à—áŠO‚ª”­¶‚·‚é‰Â”\«‚ª‚ ‚év

‚»‚ñ‚È•sŠm‚©‚ȏꏊ‚ŁAƒR[ƒh‚È‚ñ‚ď‘‚¢‚Ä‚ç‚ê‚é‚©I‚Æ‚¢‚¤‹CŽ‚¿‚É‚à‚È‚è‚Ü‚·‚ªAˆê•û‚ÅPHP‚̏ꍇAthrow‚³‚ê‚Ä‚­‚é‚à‚Ì‚É‹­‚¢§ŒÀ‚ª‚ ‚é‚Ì‚Å‚µ‚½B

PHP‚Å‚Íthrow‹å‚ÌŒã‚ë‚ɏ‘‚¯‚é‚à‚Ì‚ÍThrowableƒCƒ“ƒ^[ƒtƒF[ƒX‚ðŒp³‚µ‚½ƒCƒ“ƒXƒ^ƒ“ƒX‚¾‚¯‚ɐ§ŒÀ‚³‚ê‚Ä‚¢‚Ü‚·B(PHP5Œn‚Å‚ÍExceptionƒNƒ‰ƒX‚©A‚»‚ê‚ðŒp³‚µ‚½ƒNƒ‰ƒX‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̂݁B)

‚Ȃ̂ŁA—áŠO‚Æ‚µ‚Ä”ò‚ñ‚Å‚«‚½‚à‚Ì‚Í•K‚¸ˆÈ‰º‚̃ƒ\ƒbƒh‚ª¶‚¦‚Ä‚¢‚Ü‚·B

  • getMessage(): string
  • getCode(): int
  • getPrevious(): Throwable

ŒÂl“I‚É‚Í‚±‚̐§–ñ‚Í•Ö—˜‚¾‚ÆŽv‚Á‚Ä‚¢‚āAÅ’áŒÀ‚̃Cƒ“ƒ^[ƒtƒF[ƒX‚ªŠ„‚Æ–L•x‚Ȃ̂ŁA‚±‚̃tƒH[ƒ}ƒbƒg‚ÉŠF‚ª‡‚킹‚ê‚ΐFX‚Ɛ¶‚«‚â‚·‚­‚È‚è‚Ü‚·B

—á) PHPUnit‚Ì—áŠOƒnƒ“ƒhƒŠƒ“ƒO

‚¢‚­‚‚©‚̃tƒŒ[ƒ€ƒ[ƒN‚ł́A‚Ç‚ñ‚È—áŠO‚ª‹N‚«‚½‚Æ‚µ‚Ä‚à•K‚¸‚±‚ê‚ç‚̃ƒ\ƒbƒh‚ª¶‚¦‚Ä‚¢‚邱‚Æ‚ð—˜—p‚µ‚āAƒtƒH[ƒ}ƒbƒg‰»‚µ‚Ä—áŠO‚ð•\Ž¦‚µ‚Ä‚­‚ê‚Ü‚·B

‚½‚Æ‚¦‚΃eƒXƒgƒtƒŒ[ƒ€ƒ[ƒN‚Å‚ ‚éPHPUnit‚ŁAƒeƒXƒgŽÀs’†‚É—áŠO‚ª‹N‚«‚é‚ƁAˆÈ‰º‚̂悤‚È•\Ž¦‚É‚È‚è‚Ü‚·B

.E..................................

Time: 59 ms, Memory: 4.00MB

There was 1 error:

1) Spindle\Collection\CollectionTest::testFoo
Exception: example message

/Users/hiraku/src/github.com/spindle/spindle-collection/tests/CollectionTest.php:16

{—áŠOƒNƒ‰ƒX–¼}: {getMessage()‚Ì’†g} ‚Æ‚¢‚¤Š´‚¶‚Å‚·‚ˁB

—á) symfony/console‚Ì—áŠOƒnƒ“ƒhƒŠƒ“ƒO

ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒc[ƒ‹‚ðì‚é‚Æ‚«‚É‚æ‚­Žg‚í‚ê‚éAsymfony/console‚¾‚ƁAˆ—’†‚É—áŠO‚ª”­¶‚·‚é‚ƈȉº‚̂悤‚È•\Ž¦‚ðŽ©“®‚ōì‚Á‚Ä‚­‚ê‚Ü‚·B

symfony-console1.png

‚±‚ê‚à—áŠOƒNƒ‰ƒX–¼‚ÆgetMessage‚Ì’†g‚ðÌ—p‚µ‚Ä‚¢‚Ü‚·‚ˁB

message‚âcode‚͉½‚ð‘‚­‚ׂ«‚©

—áŠO‚̃Rƒ“ƒXƒgƒ‰ƒNƒ^‚Í3‚ˆø”‚ðŽæ‚è‚Ü‚·B

  • string $message
  • int $code
  • Throwable $previous

¡‚܂łɏq‚ׂ½‚悤‚ÈŽg‚í‚ê•û‚ð‘z’è‚·‚é‚ɁA$message‚͉½‚ª‹N‚«‚½‚Ì‚©‚ð‚È‚é‚ׂ­Ú×‚ɏ‘‚­‚ׂ«‚Å‚µ‚傤B “ú–{Œê‚©‰pŒê‚©‚Í“Á‚É‹K’肳‚ê‚Ä‚¢‚È‚¢‚̂ŃvƒƒWƒFƒNƒg‚Ì•ûjŽŸ‘æ‚Å‚·‚ªAŒÅ’蕶Œ¾‚¾‚¯A‚Æ‚©‚Å‚Í‚È‚­ó‹µ‚ðÚ‚µ‚­à–¾‚·‚éid‚⎞‚È‚Ç‚à–„‚ߍž‚Þ‚Æ—Ç‚¢‚Å‚µ‚傤B

$code‚ÉŠÖ‚µ‚ẮAPHP“à‚Å‚à“Á‚É‚±‚ê‚ÆŒ¾‚Á‚½•W€‚Í‚È‚¢‚悤‚ÉŽv‚¢‚Ü‚·BƒLƒƒƒbƒ`‘¤‚ƈ¬‚Á‚Ä“Á’è‚̃R[ƒh‚ð“ü‚ê‚Ä‚à‚¢‚¢‚Å‚·‚µAŽg‚í‚È‚¯‚ê‚Ώȗª‚©0‚Å‚©‚Ü‚í‚È‚¢‚Å‚µ‚傤B

‚¿‚Ȃ݂ɁAwebƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚̃Gƒ“ƒhƒ†[ƒU[‚ɑ΂µ‚Ă͏ڍׂ·‚¬‚éƒGƒ‰[‚Í•\Ž¦‚·‚é‚ׂ«‚Å‚Í‚È‚¢A‚Ý‚½‚¢‚È‹c˜_‚à‚ ‚è‚Ü‚·‚ªA

  • —áŠO‚Í‚ ‚­‚܂ŏڍׂÈmessage‚ðì‚é
  • ‰B‚µ‚½‚¢‚È‚çˆê“xƒLƒƒƒbƒ`‚µ‚ănƒ“ƒhƒŠƒ“ƒO‚·‚é

‚Æ‚¢‚¤•ûj‚Å‚ ‚é‚ׂ«‚Å‚·B‚»‚à‚»‚àA—áŠO‚ð“Š‚°‚é•û‚́A’N‚ª‚±‚Ì—áŠO‚ðŽó‚¯Ž~‚ß‚é‚©‚𐧌ä‚Å‚«‚È‚¢‚Ì‚Å‚·‚©‚çB

—áŠO‚Ì“Š‚°’¼‚µ‚Æ$previous‚ÌŠˆ—p

ê‡‚É‚æ‚Á‚ẮAˆË‘¶æ‚̃‰ƒCƒuƒ‰ƒŠ‚ª“Š‚°‚Ä‚«‚½—áŠO‚ðƒLƒƒƒbƒ`‚µ‚āA•Ê‚Ì—áŠO‚Æ‚µ‚Ä“Š‚°’¼‚·‚±‚Æ‚ª‚ ‚è‚Ü‚·B

‚à‚µ‘f’¼‚É—áŠO‚ðì‚è’¼‚µ‚Ä“Š‚°‚Ä‚µ‚Ü‚¤‚ƁAŽÀŽ¿$e‚ªˆ¬‚è‚‚Ԃ³‚êA^‚ÌŒ´ˆö‚ª‚í‚©‚ç‚È‚­‚È‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·B

try {
    $foo = doSomething();
} catch (\Exception $e) {
    throw new MyException('doSomething‚ÉŽ¸”s‚µ‚Ü‚µ‚½');
}

‚±‚¤‚¢‚¤‚Æ‚«‚́AƒRƒ“ƒXƒgƒ‰ƒNƒ^‚Ì‘æŽOˆø”‚Å‚ ‚é $previous ‚ðŠˆ—p‚µ‚Ü‚µ‚傤B

try {
    $foo = doSomething();
} catch (\Exception $e) {
    throw new MyException('doSomething‚ÉŽ¸”s‚µ‚Ü‚µ‚½', 500, $e);
}

‚±‚¤‚·‚é‚ƁA^‚ÌŒ´ˆö‚ð’H‚ê‚é‚悤‚É‚µ‚‚A•\–ʏã‚Ì—áŠOƒNƒ‰ƒX‚ð·‚µ‘Ö‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·B symfony/console‚Æ‚©‚Å‚àA‚¿‚á‚ñ‚Æprevious‚ɂ͑Ήž‚³‚ê‚ĂāA‚±‚ñ‚È•—‚É•\Ž¦‚µ‚Ä‚­‚ê‚Ü‚·B

symfony-console2.png

‚à‚Á‚Æ•¡ŽG‚È—áŠO‚ðì‚é

‚½‚Æ‚¦‚΁AHTMLƒtƒH[ƒ€‚̃oƒŠƒf[ƒVƒ‡ƒ“ƒGƒ‰[‚ðl‚¦‚Ä‚Ý‚Ü‚·B

  • family_name
  • first_name
  • family_name_kana
  • first_name_kana
  • gender
  • email

‚±‚ê‚ç‚Ì‚¤‚¿Afirst_name_kana‚Æemail‚É“ü—̓Gƒ‰[‚ª‚ ‚Á‚½‚Æ‚µ‚Ü‚·B message‚́A“K“–‚ɉüs‚Å•¡”ƒƒbƒZ[ƒW‚ð‹l‚ß‚Ä‚à—Ç‚¢‚Å‚µ‚傤B

first_name_kana‚ɃJƒ^ƒJƒi‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B
email‚Í100•¶ŽšˆÈ“à‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B

‚µ‚©‚µAŽÀÛ‚̏ê–Ê‚ðl‚¦‚é‚ƁAˆÈ‰º‚̂悤‚ȏˆ—‚ðì‚肽‚­‚È‚é‚Ì‚Å‚Í‚È‚¢‚Å‚µ‚傤‚©B

  • ƒtƒH[ƒ€‚Ì‹ï‘Ì“I‚ȏꏊ‚ɐԕ¶Žš‚ŃGƒ‰[‚ðo‚µ‚½‚¢
  • ‚»‚à‚»‚à‚Ì“ü—Í’l‚à•\Ž¦‚µ‚½‚¢

‚±‚¤‚¢‚¤‚Æ‚«A‚½‚¾‚Ìstring‚Å‚ ‚é $message ‚¾‚¯‚Å‚â‚è‚­‚è‚·‚é‚Ì‚ÍŒµ‚µ‚¢‚à‚Ì‚ª‚ ‚è‚Ü‚·B‚Ȃ̂ŁA—áŠOƒNƒ‰ƒX‚É‘¼‚Ì’l‚à’~‚¦‚Ä‚µ‚Ü‚¤‚Æ—Ç‚¢‚Å‚µ‚傤B

class ValidationException extends \RuntimeException
{
    private $params;
    private $errors;
    
    public function setParams(array $params): self
    {
        $this->params = $params;
        return $this;
    }
    
    public function getParams(): array
    {
        return $this->params;
    }
    
    public function setErrors(array $errors): self
    {
        $this->errors = $errors;
        return $this;
    }
    
    public function getErrors(): array
    {
        return $this->errors;
    }
}

‚ŁA—áŠO‚ð“Š‚°‚éê–Ê‚Å‚±‚ñ‚È•—‚É‚µ‚Ü‚·B

/* //‚±‚ñ‚ȃCƒ[ƒW
$params = [
    'first_name_kana' => '‚½‚낤',
    'email' => '[email protected]',
    //...
];
 */
 
$errors = [
    'first_name_kana' => 'first_name_kana‚ɃJƒ^ƒJƒi‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B',
    'email' => 'email‚Í100•¶ŽšˆÈ“à‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B',
];

throw (new ValidationException(implode("\n", $errors), 400))
   ->setParams($params)
   ->setErrors($errors);

‚±‚ê‚È‚çAcatch‚µ‚½ValidationException‚©‚ç$params‚â$errors‚ðŽæ‚èo‚¹‚āAŒãˆ—‚à‚µ‚â‚·‚¢‚Å‚µ‚傤B

—áŠO‚Ésetter‚𐶂₷‹Z

PHP‚Ì—áŠO‚́Anew‚µ‚½‰ÓŠ‚ÅŽ©“®“I‚ɃXƒ^ƒbƒNƒgƒŒ[ƒX‚ðŽûW‚µA’~‚¦‚é‚Æ‚¢‚¤“Á’¥‚ª‚ ‚è‚Ü‚·B ‚±‚Ì‹@”\‚ðŠˆ‚©‚·‚È‚ç‚΁A—áŠOƒNƒ‰ƒX‚Ìnew‚͋ɗ̓xƒ^‘Å‚¿‚µ‚āAŠÖ”‰»‚È‚Ç‚à”ð‚¯‚½‚Ù‚¤‚ª•Ö—˜‚Å‚·B

ˆê•û‚ŁA—áŠOƒNƒ‰ƒX‚̃Rƒ“ƒXƒgƒ‰ƒNƒ^‚Í•W€‚ªŒˆ‚Ü‚Á‚Ä‚¨‚èAƒRƒ“ƒXƒgƒ‰ƒNƒ^ˆø”‚ð•ÏX‚·‚é‚Ì‚Í‚ ‚Ü‚ès‹V‚ª‚¢‚¢‚Æ‚àŒ¾‚¦‚Ü‚¹‚ñB

‚»‚±‚ŁAæ’ö‚̂悤‚Éreturn $this‚·‚ésetter‚𐶂₷‚悤‚É‚·‚é‚ƁA‚»‚̏ê‚ÅŠg’£ƒpƒ‰ƒ[ƒ^‚𑝂₷‚±‚Æ‚ª‚Å‚«‚ÄŽg‚¢ŸŽè‚ª—Ç‚­‚È‚è‚Ü‚·B

‚Ü‚Æ‚ß

PHP‚Ì—áŠO‚Æ‚¢‚¤‚ƁA‚Æ‚à‚·‚ê‚΂ǂñ‚È—áŠOŒ^‚ðŽg‚¤‚ׂ«‚©A‚Ý‚½‚¢‚È‹c˜_‚ª‘½‚­‚Ȃ肪‚¿‚Å‚·‚ªA ‚Ç‚¿‚ç‚©‚ÆŒ¾‚¦‚Î $message ‚ɉ½‚ð‘‚­‚ׂ«‚©‚Ì•û‚ªd—v‚ȃ|ƒCƒ“ƒg‚¾‚ÆŽv‚¢‚Ü‚·B

‚¤‚Ü‚­—áŠO‚ÌŽ¦‚·Œ_–ñ‚ɏæ‚é‚ƁAPHPUnit‚È‚Ç‚ÌŠeŽíƒtƒŒ[ƒ€ƒ[ƒN‚Æ‚à‰ß‚²‚µ‚â‚·‚­‚È‚è‚Ü‚·‚̂ŁAˆê“x—áŠOÝŒv‚ðŒ©’¼‚µ‚Ä‚Ý‚Ä‚Í‚¢‚©‚ª‚Å‚µ‚傤‚©B

PHPƒAƒhƒxƒ“ƒgƒJƒŒƒ“ƒ_[2017‚̈ꗗ https://qiita.com/advent-calendar/2017/php

PHP‚̍ŐV‹LŽ–