Slide 1

Slide 1 text

実運⽤におけるLaravel とNuxt での Repository のレイヤ分割の話 @Laravel/Vue.js 勉強会#7 By kon-shou

Slide 2

Slide 2 text

⾃⼰&会社紹介 ⾃⼰ Laravel: 1 年7 ヶ⽉ Nuxt: 11 ヶ⽉ 会社 会社名: オープンロジ 業種: 物流アウトソーシング Laravel+react x1 Laravel+Nuxt.js x2

Slide 3

Slide 3 text

アジェンダ 1. よく⾒るレイヤー構造の話 1min 2. オープンロジの場合の話 7min 3. Pros/ Cons 2min

Slide 4

Slide 4 text

(たぶん)よく⾒る画像

Slide 5

Slide 5 text

なるほど... ? で、実際どうやんの?

Slide 6

Slide 6 text

オープンロジの場合 届いた荷物(Warehousing) を システムで⾒たい 届いた荷物にID (WarehousingId) が貼ってあるよ!

Slide 7

Slide 7 text

データフローの概略図

Slide 8

Slide 8 text

Nuxt の世界のお話

Slide 9

Slide 9 text

pages/warehousings/_id.vue pages ├── home ├── items │ └── _id ├── schedules │ └── warehousings │ └── _id │ └── fix ├── shippings │ └── _id └── warehousings └── _id ブラウザから https://openlogi.web.example.com/warehousings/${warehousingId} にアクセス

Slide 10

Slide 10 text

warehousings/_id/index のasyncData() が呼ばれる async asyncData({ app, params, query }) { const warehousingRepository = app.$serviceProvider.get('WarehousingRepository'); const warehousingId = _.get(params, 'id'); const warehousing = await warehousingRepository.find(warehousingId); return { warehousing, }; } 真っ先に呼ばれる asyncData() で warehousingRepository. nd(warehousingId) が実⾏される

Slide 11

Slide 11 text

warehousingRepository.find() async find(warehousingId): Promise { const response = await this.axios.get(`/warehousings/${warehousingId}`); return new Warehousing(response.data); } nuxt.con g.js で this.axios.get をapi サーバーに向けている => https://openlogi.api.example.com/warehousings/${warehousingId} が叩かれる

Slide 12

Slide 12 text

ここからLaravel の世界のお話

Slide 13

Slide 13 text

今どこの話してるんだ... ? => Laravel/WarehousingContoller から Mysql を⽬指す

Slide 14

Slide 14 text

H p/Controllers/WarehousingController routing を経て show() に到達 public function show($warehousingId): Warehousing { $warehousing = $this->warehousingRepository->find($warehousingId); if (!$warehousing) { throw new HttpNotFoundException(' 指定された⼊荷が⾒つかりませんでした'); } return $warehousing; } Laravel 側でも、再度 warehousingRepository を呼ぶ

Slide 15

Slide 15 text

Domains/Warehousing/WarehousingRepository public function find($id) { return Warehousing::find($id); } ここでやるのは、モデルを⽣成して返すだけ 今のところ は... ( 伏線)

Slide 16

Slide 16 text

今どこの話してるんだ... ?

Slide 17

Slide 17 text

En tyPresenters/Domains/Warehousing/ WarehousingPresenter public function toApi($warehousing): array { $array = $warehousing->toArray(); $array['warehousing_items'] = $warehousing->warehousingItems ->map(function (WarehousingItem $warehousingItem) { return $this->warehousingItemPresenter->toApi($warehousingItem); } ); return $array; } 帰ってきたモデルをいい感じに 整形 する

Slide 18

Slide 18 text

ふたたびNuxt の世界のお話

Slide 19

Slide 19 text

再掲 warehousingRepository.find() async find(warehousingId): Promise { const response = await this.axios.get(`/warehousings/${warehousingId}`); return new Warehousing(response.data); } Laravel の WarehousingPresenter で整形したデータ (=response.data) からモデルを作る => そのモデルを pages/warehousings/_id/index に返す

Slide 20

Slide 20 text

再掲 warehousings/_id/index.vue async asyncData({ app, params, query }) { const warehousingRepository = app.$serviceProvider.get('WarehousingRepository'); const warehousingId = _.get(params, 'id'); const warehousing = await warehousingRepository.find(warehousingId); return { warehousing, }; } ここで帰るwarehousing を template タグ内で描写する。完!

Slide 21

Slide 21 text

あれ?何か良いことあるんだっけ?

Slide 22

Slide 22 text

実は、本当はrepository から⾊々と呼んでます

Slide 23

Slide 23 text

メリット 変更が発⽣した場合に、 修正範囲が狭まる データを取得するソース(DB/ElasticSearch/API/etc... )の変更が⽣ じた場合に、Repository だけを修正すればいい フロントに渡すデータを整形したい場合に、Presenter だけを修正す ればいい カッコよく⾔えば プログラムの責務分担を明確にできる

Slide 24

Slide 24 text

デメリット 初⾒殺し Join したばかりだとキャッチアップコストが上がっちゃう... 実装量が増えがち ドメインの切り⽅に迷う 「Warehousing のサブクラスは別クラスでやるべき?それとも Warehousing と同じ??」

Slide 25

Slide 25 text

でもメリットでかいよ! みんなも⾊々考えて Clean なArchitecture を⽬指していこうぜ!