Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravelから学ぶルーティング処理の実装

 Laravelから学ぶルーティング処理の実装

Webフレームワークのルーティング処理ってどんな実装になっているのか?
いい感じにルーティング定義を書けば、いい感じにControllerへディスパッチされる。
それがどんな実装で実現されているのか、Laravel5.2のコードを読むことで理解しようとした、そんな話です。

B989cc865d53d8e26fdadac99727113c?s=128

Satoshi Kawashima

July 20, 2016
Tweet

Transcript

  1. ઒ౡܛ(.01&1"#0JOD 1)1#-5 -BSBWFM͔ΒֶͿ ϧʔςΟϯάॲཧͷ࣮૷

  2. ΤϯδχΞ ઒ౡܛ!CBSJF ຊࣾࣄۀ෦+6(&.νʔϜ IUUQOB[POPIJUPKVHFNKQ

  3. 8FCϑϨʔϜϫʔΫͷϧʔςΟϯάॲཧͬͯ ͲΜͳ࣮૷ʹͳͬͯΔ͔͝ଘ஌Ͱ͔͢ʁ

  4. 3FRVFTU 8FCΞϓϦέʔγϣϯ $POUSPMMFS ʁ ίί

  5. ۩ମతʹͲΜͳ࣮૷ʹͳͬͯΔͷʁ

  6. ίʔυΛಡΜͰΈͨ ʢ-BSBWFMʣ

  7. ͍͍ͩͨ͜͏ͳͬͯΔ 3PVUF 3PVUF 3PVUF 3PVUFS 3PVUF$PMMFDUJPO w ϧʔςΟϯάॲཧΛߦ͏ຊମ w ϧʔςΟϯάఆٛΛಡΈࠐΈɺ

    3PVUFΦϒδΣΫτΛ 3PVUF$PMMFDUJPOʹಥͬࠐΉ w 3PVUF$PMMFDUJPOʹϚον͢Δ 3PVUFΛ୳ͤ͞Δ w 3PVUFʹσΟεύονͤ͞Δ w 3PVUFΫϥεͷू໿Ϋϥε w ࿈૝഑ྻͰ3PVUFΦϒδΣΫτ Λ؅ཧ͍ͯ͠Δ w ϦΫΤετͱ3PVUFΦϒδΣΫ τͱͷϚονϯάΛߦ͏ w ϧʔςΟϯάఆٛ̍ͭʹ૬౰͢Δ Ϋϥε w ࣗ਎ͷϧʔςΟϯάఆٛͱϦΫΤ ετ͕Ϛον͢Δ͔൑ఆ͢Δ w ϧʔςΟϯάઌ΁ͷσΟεύον ΋ߦ͏
  8. ͍͍ͩͨ͜͏ͳͬͯΔ 3PVUF 3PVUF 3PVUF 3PVUFS 3PVUF$PMMFDUJPO ϧʔςΟϯά͢ΔϚϯ ϧʔτ୳͢Ϛϯ σΟεύον͢ΔϚϯ

  9. ͍͍ͩͨ͜͏΍ͬͯΔ 3PVUF 3PVUF 3PVUF 3PVUFS 3PVUF$PMMFDUJPO 3FRVFTU Ϛον͢Δ3PVUF͍ͩ͘͞ ͑͑Ͱ

  10. ͍͍ͩͨ͜͏΍ͬͯΔ 3PVUF 3PVUF 3PVUF 3PVUFS 3PVUF$PMMFDUJPO 3FRVFTU ͜Ε΍Ͱ

  11. ͍͍ͩͨ͜͏΍ͬͯΔ 3PVUF 3PVUF 3PVUF 3PVUFS 3PVUF$PMMFDUJPO σΟεύον͍ͯͩ͘͠͞ 3FRVFTU ͑͑Ͱ

  12. ͍͍ͩͨ͜͏΍ͬͯΔ 3PVUF 3PVUF 3PVUF 3PVUFS 3PVUF$PMMFDUJPO 3FRVFTU $POUSPMMFS $POUSPMMFS%JTQBUDIFS Ͱ͖ͨͰ

  13. େମ͜Μͳײ͡

  14. Ϛονϯάํ๏ w 3PVUF$PMMFDUJPO͕࿈૝഑ྻͰ3PVUFΦϒδΣΫτΛ࣋ͭ w )551ϝιουͰ3PVUFΦϒδΣΫτΛநग़͔ͯ͠Βɺ্͔Βॱ൪ʹϚονϯά൑ఆΛߦ͏ ʢ࠷ॳʹϚονͨ͠΋ͷΛฦ͢ʣ $routes = [ ‘GET’

    => [ ‘entry’ => RouteA, ‘entry/{id}’ => RouteB, ], ‘POST’ => [ ‘entry/{id}’ => RouteC, ‘entry/{id}/comment/{comment_id}’ => RouteD, ], ]; ্͔Βॱ൪ʹ൑ఆ͢Δ
  15. ࿈૝഑ྻͷΩʔͰߜΓࠐΜͰ͔Β ϧʔϓॲཧ

  16. ϧʔςΟϯάॲཧͬͯҙ֎ͱ؆୯

  17. kawashima$ wc -l src/Illuminate/Routing/Router.php 1282 src/Illuminate/Routing/Router.php kawashima$ wc -l src/Illuminate/Routing/Route.php

    944 src/Illuminate/Routing/Route.php
  18. None
  19. php > $route = new ReflectionClass( '\Illuminate\Routing\Route'); php > var_dump(count($route->getMethods()));

    int(63)
  20. None
  21. ϧʔςΟϯάʹؔΘΔΫϥε܈ w3PVUFS w3PVUF$PMMFDUJPO w3PVUF w3PVUF4FSWJDF1SPWJEFS w6SM(FOFSBUPS w3FTPVSDF3FHJTUFS w1JQFMJOF w$POUSPMMFS%JTQBUDIFS w.FUIPE7BMJEBUPS

    w4DIFNF7BMJEBUPS w)PTU7BMJEBUPS w6SJ7BMJEBUPS w4ZNGPOZ$PNQPOFOUT w3PVUF w3PVUF$PNQJMFS w$PNQJMF3PVUF
  22. None
  23. ࣮͸ΊͬͪΌෳࡶ wϧʔςΟϯάͰ΍Βͳ͖Ό͍͚ͳ͍͜ͱͬͯ݁ߏ͋Δ wϛυϧ΢ΣΞͷݺͼग़͠ wϧʔςΟϯάύεͷύϥϝʔλ෦෼ͷऔಘ w$POUSPMMFS΁ͷσΟεύον wʢ-BSBWFMͷ৔߹͸ʣ$POUSPMMFSͷϝιουͷҾ਺஫ೖ w7JFX্Ͱͷ63-ੜ੒ wϧʔςΟϯάఆٛΛॻ͖΍͘͢͢ΔͨΊʹɺ৭ʑͳϝιουΛఏڙ͠ͳ͍ͱ͍ ͚ͳ͍

  24. ·ͱΊ wͪΌΜͱͨ͠ϧʔςΟϯάॲཧͷ࣮૷͸࣮͸݁ߏෳࡶ w๻Β͸ϏδωεϩδοΫͷ࣮૷ʹूத͍ͨ͠ wϧʔςΟϯάॲཧ͸ຊ࣭ͷ෦෼͡Όͳ͍ wຊ࣭͡Όͳ͍͚Ͳ΍Βͳ͖Ό͍͚ͳ͍͜ͱ͕ͨ͘͞Μ͋Δॲཧ wϧʔςΟϯά͚ͩߦ͏Α͏ͳϚΠΫϩϑϨʔϜϫʔΫ΍ίϯϙʔωϯτ͸͋Δ ͷͰɺͦ͏͍͏ͷΛ࢖͍·͠ΐ͏