EXCEL VBAやPHP、Laravelに関するWINDOWS・WEBプログラミングの解説ブログです。

Laravel10+Inertia+Reactでログイン・追加・更新・削除機能

  • 2023年8月17日
  • 2023年9月2日
  • Laravel

久しぶりの投稿になりますが、Laravel10+Inertia+Reactでログイン・追加・更新・削除機能を作成しました。フロント側のReactとLaravelでCRUDシステムを作成するには、従来、Laravel側としては、axiosを経由して、JSONデータを渡したり受け取ったりのみの裏方仕事のような地味な役割?を担っていたかと思いますが、InertiaのおかげでLaravel側でフロント側もバックエンド側も、別のプロジェクトとしてではなく、一つのプロジェクトとして開発できるようになっています。今回は、本のタイトル・内容・カテゴリーを登録・更新・削除するCRUDを作成しました。

作成する上でのポイントがいくつかあります。Scriptのメイン関数への引数の渡し方がネットで見られるLaravel9での情報とは異なっております。また、TextareaInput.jsxやBluButton.jsxなどの独自ファイルをComponents内に作成しました。モーダルウインドウは、DeleteUserForm.jsxを参考にして登録フォーム、更新フォームを作成しました。

コントローラーへの値の受け渡しは、従来のaxios経由とは異なり、非常にあっさりとしており、開発効率はとても良いです。また、認証の処理もjwt authなど使うこともなく、特に意識することもなく出来てしまいますので、淡白に開発ができます。

なお、メインファイルのIndex.jsxの記載でブログとYoutubeで異なる箇所がありますので、「最後に」の後にYoutubeでのコードも残しておきます。

準備

Laravelのプロジェクト作成

Laravelプロジェクトを作成します。

composer create-project laravel/laravel Laravelのプロジェクト名

※envファイルでDBの設定はしておきます。普通のmySQLの設定と同じです。

Laravel Breezeのインストール

認証のための機能Breezeのインストールをします。

composer require laravel/breeze –dev

※devの前のハイフンは二つ必要です。以下に似たような箇所があれば、同じようにご判断ください。

Reactのインストール

上のBreezeのインストールと同じ階層で行います。従来のReactとLaravelでは別の階層(別のURLとなるように)で、別々のプロジェクトを作成していましたが、同じ階層で下のコマンドを打ちます。

php artisan breeze:install react

これでReactとInertiaが導入されます。

app.phpの編集

ダミーデータ作成のために、日本語化しておきます。
‘locale’ => ‘ja’,
‘fallback_locale’ => ‘ja’,
‘faker_locale’ => ‘ja_JP’,

テーブルの作成、ダミーデータの挿入

Booksモデルを作成します。

php artisan make:model Books -mcrf

モデルBooks.phpだけではなく、ファクトリーBooksFactory.phpとコントローラーBooksController.phpとマイグレーションファイルが作成されます。

マイグレーションファイルを編集します。下を追加します。

$table->string(‘title,12);
$table->text(‘content’);
$table->string(‘category’,10);

Books.phpでフィールドをホワイトリスト化します

useHasFactory;の下に、
protected $fillable = [‘title’,’content’,’category’];
を追加します。
Booksファクトリーを編集します。
definition()内を以下のようにします。
$categorys = [‘React’,’Vue’,’Laravel’];
return [
‘title’ => $this -> faker -> text(12),
‘content’ => $this -> faker -> text(20),
‘category’ => $this -> faker -> randomElement($categorys)
];
DatabaseSeeder.php を編集します。
use App\Models\Books; を追記して、
run内に
Books::factory(7)->create();
を記入します。
シーダーを実行します。
php artisan migrate –seed
テーブルおよびレコードの生成を確認しました。titleとcontentが英語で表示されていますが、$this>faker>realTextとしておけば良かったです(笑)。

Booksコントローラー

コントローラーの編集です。普通ですね。

use Inertia\Inertia;が必要です。それぞれのメソッドでフロンと側に、booksとmessageを渡しています。

ルーティング

web.phpに追記します。

use App\Http\Controllers\BooksController; これを追記
Route::middleware(‘auth’)->group(function () { の中に
Route::get(‘/books’, [BooksController::class, ‘index’])->name(‘books.index’);
Route::post(‘/books/store’, [BooksController::class, ‘store’])->name(‘books.store’);
Route::put(‘/books/update/{id}’, [BooksController::class, ‘update’])->name(‘books.update’);
Route::delete(‘/books/destroy/{id}’, [BooksController::class, ‘destroy’])->name(‘books.destroy’
);
を追記します。これも、普通のLaravel?と一緒です。

上部メニューの作成

C:\xampp\laravel-project\my-react4\resources\js\Layouts\AuthenticatedLayout.jsxを編集します。

Dashboardの下に

<divclassName=“hidden space-x-8 sm:-my-px sm:ml-10 sm:flex”>
<NavLinkhref={route(‘books.index’)}active={route().current(‘books.index’)}>
                                    Books
</NavLink>
</div>
を追加します。そうしますと、ログイン後 上部メニューに Books リンクを確認できます。
スマホ用リンクが下の方にあるので、そちらも同様にしておきます。

Index.jsx メインファイルの作成

Pagesフォルダの下に、Books フォルダを作成して、 Index.jsxファイルを作成します。Iは大文字で始まります。

booksテーブルの一覧表示

コントローラーのindexメソッドをフロント側index.jsxに渡して、表示させます。
Dashboard.jsxをコピーして貼り付けて、編集していきます。
laravel9+Reactの他の情報を見ていますと、メイン関数への引数として、props を渡しているのを見かけますが、Laravel10では、デフォルトの引数がauthでした。引数として、propsではなくて、 auth と books を渡してあげます。export default function Dashboard({ auth,books }) の箇所です。
booksテーブルのレコードの表示を確認しました!

Modalの導入

コントローラーのstoreメソッドにフロント側から値を渡す処理をします。
.\Profile\Partials\DeleteUserForm.jsx から import部分、DangerButton・Modal部分、return下のconstではじまる定義部分をコピーして,Index.jsxに貼り付けます。

「DELETE ACCOUNT」ボタンが設置されており、クリックするとモーダルウインドウが表示されます。

import部分

javascript部分

Modal部分

フォーム部品の作成

モーダルウインドウ内のフォームに、タイトル、内容、カテゴリーを入力するボックスが必要となります。textInput.jsxは最初から有りますが、textareaとselectに相当するパーツがありませんので、これを作成します。
./js/components/にTextInput.jsxファイルがあるので、これを複製します。ファイル名をTextarea.jsxとSelect.jsxとします。

Textarea.jsxの作成

<Input の箇所をtextareaにします。閉じタグであったところを、</textarea> とします。

Select.jsxの作成

type = ‘text’ を options = null とします。
<input を <select とします。
type={type} 部分を削除します。
閉じタグ部分を以下のようにします。

Index.jsxの編集

先ほど作成したTextarea.jsxとSelect.jsxをインポートします。また、Modal内をpasswordを参考にして以下のように変更します。
import TextInput from ‘@/Components/TextInput’;
import Select from ‘@/Components/Select’;

フォーム内でref=で出てくる関数を定義します。

    const titleInput = useRef();
    const contentInput = useRef();
    const categoryInput = useRef();

Modal内

showやonsubmitで実行される関数は名前を書き換えております。

Reactの核心部分の編集

入力した値をコントローラーに渡すための処理
以下の部分を編集追記していきます。

以下のようにします。post,put,を追加して、title,content,categoryを初期化しています。

reactの核心部分として、以下 がーっと編集します。

const confirmUserDeletion と const  deleteUser 部分だったのを、 confirmBookInsert、insertBook、confirmBookUpdate、updateBook として作成します。元々の const confirmUserDeletion と const  deleteUser 部分 を書き換えれば良いと大体推測がつくかと思います。
追加 post(route(‘books.store’)
更新 put(route(‘books.update’,data.id)
削除 destroy(route(‘books.destroy’,id)
として、コントローラーにオブジェクトを渡しています。

動作確認

追加

本を追加してみます。
はい、下のように登録されました!

更新

更新についても、このようにレコードの値を取得して、フォーム上に表示できています。
更新ボタンをクリックしますと、

削除

削除ボタンをクリックしますと、削除されます。

最後に

Laravel10上で、Inertia経由でreactのアプリを容易に作成できるようになったのは、とても喜ばしいことだと思います。雰囲気としては、フロント側の開発をしている感じがしなくて、従来のLaravelアプリの開発と似ているように思いました。いつか、もっと複雑なものを公開したいとは思います。

Youtubeでのコード

Youtubeで同じアプリを作成する際に、componentsの部品名や関数名が異なっていますので、下に記載しておきます。

Index.jsxファイル※youtube版

Select.jsxファイル