Slide 1

Slide 1 text

/30 1 ॥؀ࢀরͯ͠ΔEntityͷ γϦΞϥΠζͱ͔ͷ࿩ #symfony_meetup 2018.07.08 @ttskch

Slide 2

Slide 2 text

ttskchʢ͖ͨͭͪʣ 2 • ໊ݹ԰͔Βདྷ·ͨ͠ • (ג)ΧϧςοτίϛϡχέʔγϣϯζCTO • PHPྺ6.5೥ɺSymfonyྺ4೥ʢROMઐʣ • ͓ख఻͍ͨ͠ຊʢ2015/12ʣ /30

Slide 3

Slide 3 text

͋͞ɺ͋ͳͨ΋ࠓ͙͢ϑΥϩʔ͠Α͏!!! ׬શແྉ ͨ ͭ ͖ ͪ twitter.com/ttskch ·͞ʹ໊ݴ੡଄ػ ਓੜͰେ੾ͳ͜ͱ͸ɺ͢΂ͯ ͖͔ͨͭͪΒڭΘͬͨ ͖ͨͭͪΛϑΥϩʔͨ͠Β
 ࠊ௧͕࣏Γ·ͨ͠ ͍ͯ͠Δ ͍ͯ͠ͳ͍ ͖ͨͭͪΛϑΥϩʔ͍ͯ͠Δʁ ϑΥϩϫʔ͞Μ100ਓʹฉ͖·ͨ͠ 100% φϯτʂ ϑΥϩϫʔ͔Βͷࢧ࣋཰ 3/30

Slide 4

Slide 4 text

• PHPer/JSer ઈࢍେืूதʂʢϑϧϦϞʔτϫʔΫՄʂʣ • ϦεςΟϯά޿ࠂӡ༻πʔϧʮLisketʯΛఏڙ • ࣌୅ΛઌऔΔϗϫΠτاۀͰ͢ (ג)Χϧςοτίϛϡχέʔγϣϯζ 4 ಛผ৆ड৆ /30

Slide 5

Slide 5 text

5 (ג)Χϧςοτίϛϡχέʔγϣϯζ ΤϯδχΞͷಇ͖΍͢͞௒େࣄʹͯ͠·͢ /30

Slide 6

Slide 6 text

6 (ג)Χϧςοτίϛϡχέʔγϣϯζ SNSͳͲ͔Β͓ؾܰʹ͝࿈བྷ͍ͩ͘͞✨ /30

Slide 7

Slide 7 text

/30 7 ॥؀ࢀরͯ͠ΔEntityͷ γϦΞϥΠζͱ͔ͷ࿩ #symfony_meetup 2018.07.08 @ttskch /30

Slide 8

Slide 8 text

class User { public $name; /** * @var Post[] */ public $posts; } 8 Α͋͘Δ User(1) - Post(N) class Post { public $title; /** * @var User */ public $user; } /30

Slide 9

Slide 9 text

$serializer = SerializerBuilder::create()->build(); $json = $serializer->serialize($user, 'json'); echo $json; 9 jms/serializerͰUserΛγϦΞϥΠζ /30

Slide 10

Slide 10 text

{ "name": "user1", "posts": [ { "title": "post1" }, { "title": "post2" } ] } 10 ݁Ռ posts.user͕ফ͑ڈͬͯΔ /30

Slide 11

Slide 11 text

class User { public $name; /** * @var Post[] */ public $posts; } 11 user.posts.user = userʢ॥؀ࢀরʣ class Post { public $title; /** * @var User */ public $user; } /30

Slide 12

Slide 12 text

ͳΔ΄Ͳ͔֬ʹ 12 • ͩͬͨΒɺMaxDepth(1) ͱ͔΍͓͚ͬͯ͹
 ҆શʹγϦΞϥΠζͰ͖ΔͷͰ͸ʁ /30

Slide 13

Slide 13 text

use JMS\Serializer\Annotation\MaxDepth; class User { public $name; /** * @var Post[] * * @MaxDepth(1) */ public $posts; } 13 ΍ͬͯΈͨ /30

Slide 14

Slide 14 text

- $serializer = SerializerBuilder::create()->build(); + $serializer = SerializerBuilder::create() + ->setSerializationContextFactory(function () { + return SerializationContext::create() + ->enableMaxDepthChecks() + ; + }) + ->build() + ; 14 ΍ͬͯΈͨ MaxDepthͷνΣοΫΛ༗ޮԽ /30

Slide 15

Slide 15 text

{ "name": "user1", "posts": [ { "title": "post1" }, { "title": "post2" } ] } 15 ݁Ռ มΘΒͣɻ /30

Slide 16

Slide 16 text

ΑΖ͍͠, ͳΒ͹ print σόοάͩ 16/30

Slide 17

Slide 17 text

if ((null === $v && $context->shouldSerializeNull() !== true) || (true === $metadata->skipWhenEmpty && ($v instanceof \ArrayObject || \is_array($v)) && 0 === count($v)) ) { return; } 17 JsonSerializationVisitor.php ͜͜Ͱreturnͯͨ͠ʢ஋͕null͔ͭɺnull͸γϦΞϥΠζ͠ͳ͍ઃఆʣ /30

Slide 18

Slide 18 text

$serializer = SerializerBuilder::create() ->setSerializationContextFactory(function () { return SerializationContext::create() ->enableMaxDepthChecks() + ->setSerializeNull(true) ; }) ->build() ; 18 null΋γϦΞϥΠζ͢ΔΑ͏ʹઃఆ /30

Slide 19

Slide 19 text

{ "name": "user1", "posts": [ { "title": "post1", "user": null }, { "title": "post2", "user": null } ] } 19 ֬ೝ post.user͸͔֬ʹnullʹͳͬͯΔ /30

Slide 20

Slide 20 text

͞Βʹ print σόοά 20/30

Slide 21

Slide 21 text

if ($context->isVisiting($data)) { return null; } 21 GraphNavigator.php ͜͜Ͱnullʹͳͬͯͨ /30

Slide 22

Slide 22 text

if ($context->isVisiting($data)) { return null; } 22 ࣮ݧɿಉҰΦϒδΣΫτ͡Όͳ͚Ε͹͍͚Δͷ͔ ϓϩύςΟΛτοϓμ΢ϯͰḷΓͭͭɺ๚໰த ͷΦϒδΣΫτΛελοΫ͓͍ͯͯ͠ɺ৽ͨʹ๚ ໰ͨ͠ΦϒδΣΫτ͕๚໰தελοΫʹੵ·Ε ͯͨΒ࠶ؼͳͷͰnullʹ͢Δɺͱ͍͏࣮૷Έ͍ͨ /30

Slide 23

Slide 23 text

foreach ($user->posts as $post) { $post->user = clone $user; } $json = $serializer->serialize($user, 'json'); 23 clone $user ͯ͠ஔ͖׵͑ͯΈΔ /30

Slide 24

Slide 24 text

{ "name": "user1", "posts": [ { "title": "post1", "user": { "name": "user1", "posts": [ null, null ] } }, : ] } 24 ݁Ռ ͳΔ΄Ͳߦ͚ͨɻ /30

Slide 25

Slide 25 text

݁࿦ 25 • jms/serializerͰ͸ɺಉҰΦϒδΣΫτ͕࠶ؼ తʹࢀর͞ΕΔΤϯςΟςΟ͸γϦΞϥΠζ Ͱ͖ͳ͍ • MaxDepthͷνΣοΫҎલʹ஄͔ΕͯΔʢଟ෼ʣ /30

Slide 26

Slide 26 text

͡Ό͋ Ͳ͏͢Ε͹ʁ 26/30

Slide 27

Slide 27 text

APIΛ෼͚Δ 27 • userͱposts͸ผʑͷAPI͔Βऔಘ͢Δ • ϑϩϯτͷΠϝʔδ http.get(`/users/${user.id}`) .then(user => http.get(`/users/${user.id}/posts`) .then(posts => ({user, posts}))) .then(({user, posts}) => { user.posts = posts; this.user = user; }) ; /30

Slide 28

Slide 28 text

// user-repository.ts get(id: string): Observable { return this.http.get(`/users/${id}`).pipe( map(response => getUserFromResponse(response)), switchMap((user: User) => this.postRepository.cgetByUser(user).pipe( map((posts: Post[]) => { user.posts = posts; return user; }) )) ); } 28 Angular (rxjs@6) ͩͱ͜Μͳײ͡ /30

Slide 29

Slide 29 text

·ͱΊ 29 • jms/serializerͰ͸॥؀ࢀর͍ͯ͠ΔΤϯςΟ ςΟ͸γϦΞϥΠζͰ͖ͳ͍ • ͜͏͍͏৔߹͸APIΛ෼͚Δͷ͕Ұൠతʢଟ෼ʣ • Qiitaʹࡉ͔͘ॻ͍ͯ·͢
 https://bit.ly/2uaINck /30

Slide 30

Slide 30 text

Thanks :) 30/30