要件定義~設計
参考記事
要件定義の目的
最終ゴールを具体的に決める
要件定義の3ステップ
要望・要求・要件
基本設計
画面設計
- 何ができる画面なのか
- 表示する情報とレイアウト
- 画面遷移図を1ページャーに
機能設計
- 機能名と処理内容
- 処理に必要なデータと、データの取得元(画面から入力、DBから取得など)
- 処理したデータの受け渡し先(画面表示、DB保存など)
データ設計
データの具体的な中身
- テーブル単位で項目を具体化する
会員情報テーブルでは何が必要か?購入履歴テーブルでは何が必要か?
データは4種類に分類できる
画面 in-out
DB in-out
データベース設計
- テーブルをマスターdataとトランザクションdataに分ける
- テーブル間の参照関係を整理
- 参照関係をER図に
データフロー
最後に 『データベースと画面遷移図の関係』 を整理すると、
システムの全体像 『画面設計×機能設計×データ設計』 が見えてきます。
ローカルスコープ
ローカルスコープとは
再利用性の高いクエリ制約を定義できる
ローカルスコープの利用方法
①Modelにスコープメソッドを定義
検索入力値がnullでなければ、半角スペースごとに区切って、and検索用のクエリを返す
public function scopeSearch($query, $search)
{
if ($search !== null) {
$search_split = mb_convert_kana($search, 's');
$search_split2 = preg_split('/[\s]+/', $search_split);
foreach ($search_split2 as $value) {
$query->where('name', 'like', '%' . $value . '%');
}
return $query;
}
}
②作成したスコープメソッドを呼び出す
スコープを呼び出すとき、scopeプレフィックスを含めずに呼び出す
$search = $request->search;
$query = ContactForm::search($search);
$contacts = $query->select('id', 'name', 'title', 'created_at')->paginate(20);
return view('contacts.index', compact('contacts'));
用途
検索フォーム機能でよく使える
共通のクエリ機能を作っておきたい場合など
ペジネーション
https://readouble.com/laravel/9.x/ja/pagination.htmlreadouble.com
シンプルに実装してみる
①Eloquentのget()でデータ取得していたのを、paginate()に書き換え
$contacts = ContactForm::select('id','name','title','created_at')->paginate(20);
②viewで表示させる
links()をコールするだけで、簡単にペジネーションを実装できる
{{ $contacts->links() }}
カスタマイズ方法
カスタマイズできるよう、以下のコマンドを実行
php artisan vendor:publish --tag=laravel-pagination
▼実行結果
Copying directory [C:\xampp\htdocs\laravel\task_test\vendor\laravel\framework\src\Illuminate\Pagination\resources\views] to [C:\xampp\htdocs\laravel\task_test\resources\views\vendor\pagination] DONE
処理内容は、
\vendor\laravel\framework\src\Illuminate\Pagination\resources\viewsフォルダを、
resources\views\vendor\pagination にコピーしたというもの
実際にフォルダができていた

tailwind.blade.phpをカスタマイズ
今回は、tailwindのテンプレが使用されていたので、この中を好きにカスタマイズすればOKでした
ダミーデータの作り方(Factory & Faker 編)
ファクトリークラスを作成
php artisan make:factory ContactFormFactory
言語設定
config > app.php のfaker_localeの設定を日本語に変更
'faker_locale' => 'ja_JP'
これで、日本語のダミーデータを作れる
Factoryクラスの中でFakerを使ってダミーデータの設定をする
difinitionメソッドに、ダミーデータとなる情報を書いていく
public function definition()
{
return [
'name' => $this->faker->name(20),
'title' => $this->faker->realText(50),
'email' => $this->faker->email(),
'url' => $this->faker->url(),
'gender' => $this->faker->boolean(),
'age' => $this->faker->numberBeetween(1, 6),
'contact' => $this->faker->realText(200),
];
}
DatabaseSeederにファクトリー情報を設定
runメソッドにダミーデータ100件登録を実装
\App\Models\ContactForm::factory(100)->create();
コマンド実行
php artisan migrate:fresh --seed
Seederの時とは違い、コンソールに完了のログは出力されないので、
データベースにデータが入っているか直接確認が必要
いい感じにデータ100件を入れてくれる
ダミーデータの作り方(Seeder編)
Seederクラスを生成
php artisan make:seeder XxxSeeder
クエリビルダのDBファサードで作ってみる
Seederクラスに、DBとHashのファサードクラスをuse
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash;
Seederクラスのrunメソッドでダミーデータを生成
DBファサードで、testsテーブルへのダミーデータ生成コードを書く
DB::table('tests')->insert([
[
'text' => 'aaa'
],
[
'text' => 'bbb'
],
]);
DatabaseSeederで、対象のSeederを読み込み
public function run()
{
$this->call([
TestSeeder::class,
]);
}
コマンド実行
テーブル全削除>再作成>ダミーデータ作成
php artisan migrate:fresh --seed
・実行結果
INFO Running migrations. 2014_10_12_000000_create_users_table .................................... 131ms DONE 2014_10_12_100000_create_password_resets_table .......................... 160ms DONE 2019_08_19_000000_create_failed_jobs_table .............................. 103ms DONE 2019_12_14_000001_create_personal_access_tokens_table ................... 106ms DONE 2024_03_12_193122_create_tests_table ..................................... 34ms DONE 2024_03_16_095612_create_contact_forms_table ............................ 104ms DONE 2024_03_16_113514_add_title_to_contact_forms_table ....................... 90ms DONE INFO Seeding database. Database\Seeders\TestSeeder ................................................ RUNNING Database\Seeders\TestSeeder .......................................... 15.34 ms DONE
テーブルが全削除>全作成>ダミーデータ作成 の順番で実行された
バリデーション
フォームリクエストバリデーション
フォームリクエストは、独自のバリデーションおよび認可ロジックをカプセル化する、カスタムリクエストクラス
php artisan make:request XxxXxxRequest
コントローラー側の処理
コントローラー側で入力データを受けるときに、カスタムリクエストクラス型の引数で受ける必要がある
そうすることで、カスタムリクエストクラスで設定したバリデーションチェックを反映させることができる
フォームリクエストバリデーションのメリット
コントローラー側でバリデーションチェックのコードを書かなくてよくなり、シンプルなコード管理が可能
リクエストクラスの2つのメソッド
リクエストクラスの中を確認すると、authorize()とrule()の2つのメソッドがある
バリデーションルールは、rule()に書いていきます
エラーメッセージを表示させる
x-コンポーネントを作成して、その中にエラー処理を書いておくのが主流
@props(['messages'])
@if ($messages)
<ul {{ $attributes->merge(['class' => 'text-sm text-red-600 dark:text-red-400 space-y-1']) }}>
@foreach ((array) $messages as $message)
<li>{{ $message }}</li>
@endforeach
</ul>
@endif
viewでエラー対象のコンポーネントを呼び出す
<x-input-error :messages="$errors->get('email')" class="mt-2" />
エラーのあと、入力値を保持したい
old()を使うことで、入力値を維持できる
・radioボタンで、三項演算子を使ったold()例
<input type="radio" name="gender" value="0" {{ old('gender') == 0 ? 'checked' : '' }}>男性
<input type="radio" name="gender" value="1" {{ old('gender') == 1 ? 'checked' : '' }}>女性
コレクション
コレクションとは、Laravel独自の形式で配列を操作する機能が拡張されたラッパークラス
コレクションの実態
実態はオブジェクトで、その中に配列本体が格納されてる
$collection = colect([1,2,3]); var_dump($collection);
//結果
object(Illuminate\Support\Collection)#279 (2) { ["items":protected]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["escapeWhenCastingToString":protected]=> bool(false) }
使い方は、配列をコレクション形式に変換後、定義されてるメソッドを呼び出すことで、様々な機能を実装できる
Eloquentの返り値は、コレクション
Eloquentの返り値は、自動的にコレクション配列に変換される
$records = User::all(); var_dump($records);
//結果:object(Illuminate\Database\Eloquent\Collection)#327 (2) { ["items":protected]=> array(42) { [0]=> object(App\Models.....
コレクションは作ることができる
collect()メソッドを使用
$collection = collect([1,2,3]);
collect()メソッドは、返り値としてコレクションインスタンスを返すため、変数で受け取る必要があります
豊富なメソッド
コレクションインスタンスを受け取ったら、既に定義してあるたくさんのメソッドを使用することができる
よく使うメソッド一覧