見出し画像

競馬キュレーションサイトを作るよ!#16

プロトタイプを作る前に、Laravelのデザインパターンをちょっとだけ考えてみます。

スケジュール

1. 各メディアを調査
2. システム構成を決める
3. 開発環境を作る
4. プロトタイプ作成 ← まだこの前
5. 実装
6. テスト
7. 公開

Laravelのデザインパターン

フレームワークといえばMVCデザインパターン。
LaravelもMVCを踏襲してはいますが、ディレクトリ構造はそうなっていません。
そのへんユーザが決める必要があります。
つまりユーザがMVCの意味自体を考えなきゃならないってことです。
プロトタイプなのでチャチャッと作ればいいんですが、後からやるのも面倒なので最初にやっときましょう。

まずそもそもMVCの意味をはっきりさせます。

MVCとは?

wikiにはこんなふうに書かれています。

wikipedia: Model View Controller

3要素ともけっこう曖昧・・・。
概念なので仕方ないんですが、実装は曖昧なままにするわけにはいきません。
てか、出来ない(みんなどうやってんだろ?)。

なので、MVCがLaravelでどういうディレクトリ(ファイル)として定義されているのか見てみます。

LaravelのMVCとディレクトリ構造

このへんまとめてくれている人がたくさんいます。
こういうのはnoteよりQiitaの方が活発ですね。

Laravel5.5のディレクトリ構造まとめ
Laravelのディレクトリ構造と、お役立ちTips
Laravelのディレクトリ構造について学ぶ

LaravelのMVCをまとめると↓

■モデル
ディレクトリ:app
すでにmigrateを実行した後なのでUser.phpがあります。
「php artisan make:model」でモデルを生成すると、ここにEloquentモデルを継承したクラスファイルが作られます。
つまりDBアクセスを抽象化したクラス群とみていいでしょう。

■ビュー
ディレクトリ:resources
この下にはassets,lang,viewsディレクトリがあります。
assetsにはcssやjavascript、langは言語別のファイル、viewsにはbladeファイルが置かれます。
画面に表示する内容を生成するためのファイル群です。
wikiのビューの定義と同じですね。

■コントローラ
ディレクトリ:app/Http/Controllers
ブラウザからのリクエストの出入口になります。
こちらもwikiのコントローラの定義と同じとしていいでしょう。

モデルがちょっと曖昧です。
wikiではビジネスロジックと呼ばれる実処理をモデルに書くことになってます。
でも疑問が出てきますよね。
DBアクセスしないときもモデルとするのか?
それともコントローラに書くのか?
コントローラに書いた場合、コントローラの定義から外れるんじゃないか?
DBにアクセスする場合も、DB以外のデータ処理もするでしょう。
その処理までモデルで行うのか?
たとえば、スクレイピング処理までモデルに書くのは違和感があります。

モデル周りはユーザがちゃんと考えてやる必要があります。

サービスを導入

DBアクセスとそれ以外の処理を切り離すためにサービスを導入します。
デザインパターンとしてのサービスも曖昧な概念なのですが、ここでは下のように定義します。

モデル以外のデータ処理

モデルはDBアクセスのみ、コントローラはHTTPのリクエストとレスポンスだけ、それ以外の実処理をサービスで行うとします。
ディレクトリは app/Services。
ビューからは直接モデルにアクセスしません(できるだけ)。

コントローラと実処理をわけておくと、後でテストケースを書きやすくなるというメリットもあります。

Modelsディレクトリ

モデルもapp下にずらっと作ると鬱陶しいので、ついでディレクトリ app/Models を切っておきます。
今ある app/User.php を app/Models/User.php に移動します。
いくつかこのUserクラスを使っている箇所があるので変更しときましょう。

User.php

- namespace App;
+ namespace App\Models;

app/Http/Controllers/Auth/RegisterController.php

- use App\User;
+ use App\Models\User;

config/auth.php

-            'model' => App\User::class,
+            'model' => App\Models\User::class,

config/services.php

-        'model' => App\User::class,
+        'model' => App\Models\User::class,

まとめ

今回は実処理を行うサービスを導入し、モデルをModelsディレクトへ設置することにしました。
次回はデータ構造を決め、テーブルを作成するためのmigrationファイルを作成します。

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

note.user.nickname || note.user.urlname

絶対に世のため人のためにはせず、くだらないことに使わせて頂きます。

謝謝

Z80A

見た目は大人、中身はZ80Aくらい。 職業:インチキプログラマ

競馬キュレーションサイトを作るよ!

Laravelを使って競馬情報収集システムを構築します。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。