ペジネーション

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.phpfaker_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()メソッドは、返り値としてコレクションインスタンスを返すため、変数で受け取る必要があります

豊富なメソッド

コレクションインスタンスを受け取ったら、既に定義してあるたくさんのメソッドを使用することができる
よく使うメソッド一覧

https://appdev-room.com/php-laravel-collection

Laravelで入力データをDBに保存する方法

Laravelで、DBにデータを保存する方法はいくつかあります
その中でも、Modelクラスのcreateメソッドを使った方法を説明します

Modelクラスのcreateメソッドで保存する方法

入力データはまずvalidationチェックをかけます
その後、ModelクラスのcreateメソッドでDBに保存します

Modelクラスのcreateメソッドで、一括でDB登録できるようにする為の準備

以下のように、Modelクラスにfillableまたはguardedプロパティを指定することで、一括DB登録が可能になります

protected $fillable = [
'name',
'email,
'passowrd',
];

コード例

以下のように、連想配列key=>valueでDBデータを登録します

$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);

データを登録後、画面にリダイレクトさせる

下記コードのように、リダイレクトさせたいviewに繋がるrouteを設定します

return to_route('contacts.index');



RequestクラスとDI

Requestクラスとは?

$_POSTをさらに拡張したようなクラス
Form等で送られてきたデータを登録する際に使用される

DIとは?

Dependency Injection(依存性の注入)
外側でインスタンス化したものが、注入される仕組み

特徴

事前にControllerクラスでRequestクラスのuseが必要
use Illuminate\Http\Request;

Requestクラスの中には、60件以上の関数が用意されてる(2024年1月現在)
あらゆる機能が使用できる万能クラス

DIのメリット

下記サンプルコードで説明すると、$requestが引数を受け取った時点で、インスタンス化された状態になっている為、
冗長なコードを書く必要なく、データ登録の処理に進めることができる

public function store(Request $request){
dd($request,$request->name);
}

まとめ

DIにより外部でインスタンス化してくれることで、冗長なコードを減らし、データベースとのやりとりを簡素化してくれる