laravel 9 react js crud example; Through this tutorial, we will learn how to make react crud with laravel 9 apps.
Laravel 9 React CRUD Example
Just follow the following steps on how to create crud app using react with laravel 9 apps:
- Step 1 – Install Laravel Application
- Step 2 – Configure Database
- Step 3 – Create Auth with Breeze
- Step 4 – Create Migration and Model
- Step 5 – Create Routes
- Step 6 – Create Controller
- Step 7 – Create Views
- Step 8 – Start Development Server
Step 1 – Install Laravel Application
First of all, open terminal and execute the following command on command line to install laravel fresh application:
composer create-project laravel/laravel example-app
Step 2 – Configure Database
Step 3 – Create Auth with Breeze
Then execute the following command on command line to create auth with breeze in laravel apps:
composer require laravel/breeze --dev php artisan breeze:install react npm install npm run dev
Step 4 – Create Migration and Model
Create migration and model file by executing the following command on command line:
php artisan make:migration create_posts_table
Then update migration file by using the following code:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('body'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('posts'); } }
And execute the following command on command line to create Post.php model:
php artisan make:model Post
Now, visit to App/Models/ directory and open Post.php file. And update the following code into it:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFactory; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'title', 'body' ]; }
And then, execute the following command on command line to create tables into database:
php artisan migrate
Step 5 – Create Routes
Visit to routes directory and open web.php. Then add the following routes into it:
<?php use Illuminate\Foundation\Application; use Illuminate\Support\Facades\Route; use Inertia\Inertia; use App\Http\Controllers\PostController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::resource('posts', PostController::class); Route::get('/', function () { return Inertia::render('Welcome', [ 'canLogin' => Route::has('login'), 'canRegister' => Route::has('register'), 'laravelVersion' => Application::VERSION, 'phpVersion' => PHP_VERSION, ]); }); Route::get('/dashboard', function () { return Inertia::render('Dashboard'); })->middleware(['auth', 'verified'])->name('dashboard'); require __DIR__.'/auth.php';
Step 6 – Create Controller
Execute the following command on command line to create postController file:
php artisan make:controller PostController
Then visit to app/Http/Controllers/ directory and open PostController.php. And update the following code into it:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Inertia\Inertia; use App\Models\Post; use Illuminate\Support\Facades\Validator; class PostController extends Controller { /** * Show the form for creating a new resource. * * @return Response */ public function index() { $posts = Post::all(); return Inertia::render('Posts/Index', ['posts' => $posts]); } /** * Write code on Method * * @return response() */ public function create() { return Inertia::render('Posts/Create'); } /** * Show the form for creating a new resource. * * @return Response */ public function store(Request $request) { Validator::make($request->all(), [ 'title' => ['required'], 'body' => ['required'], ])->validate(); Post::create($request->all()); return redirect()->route('posts.index'); } /** * Write code on Method * * @return response() */ public function edit(Post $post) { return Inertia::render('Posts/Edit', [ 'post' => $post ]); } /** * Show the form for creating a new resource. * * @return Response */ public function update($id, Request $request) { Validator::make($request->all(), [ 'title' => ['required'], 'body' => ['required'], ])->validate(); Post::find($id)->update($request->all()); return redirect()->route('posts.index'); } /** * Show the form for creating a new resource. * * @return Response */ public function destroy($id) { Post::find($id)->delete(); return redirect()->route('posts.index'); } }
Step 7 – Create Views
Create react js file for Index.jsx, Create.jsx and Edit.jsx.
Then visit to resources/js/Pages/Posts/ directory create index.jsx file. And update the following code into it:
import React from 'react'; import Authenticated from '@/Layouts/Authenticated'; import { Inertia } from "@inertiajs/inertia"; import { Head, usePage, Link } from '@inertiajs/inertia-react'; export default function Dashboard(props) { const { posts } = usePage().props function destroy(e) { if (confirm("Are you sure you want to delete this user?")) { Inertia.delete(route("posts.destroy", e.currentTarget.id)); } } return ( <Authenticated auth={props.auth} errors={props.errors} header={<h2 className="font-semibold text-xl text-gray-800 leading-tight">Posts</h2>} > <Head title="Posts" /> <div className="py-12"> <div className="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div className="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div className="p-6 bg-white border-b border-gray-200"> <div className="flex items-center justify-between mb-6"> <Link className="px-6 py-2 text-white bg-green-500 rounded-md focus:outline-none" href={ route("posts.create") } > Create Post </Link> </div> <table className="table-fixed w-full"> <thead> <tr className="bg-gray-100"> <th className="px-4 py-2 w-20">No.</th> <th className="px-4 py-2">Title</th> <th className="px-4 py-2">Body</th> <th className="px-4 py-2">Action</th> </tr> </thead> <tbody> {posts.map(({ id, title, body }) => ( <tr> <td className="border px-4 py-2">{ id }</td> <td className="border px-4 py-2">{ title }</td> <td className="border px-4 py-2">{ body }</td> <td className="border px-4 py-2"> <Link tabIndex="1" className="px-4 py-2 text-sm text-white bg-blue-500 rounded" href={route("posts.edit", id)} > Edit </Link> <button onClick={destroy} id={id} tabIndex="-1" type="button" className="mx-1 px-4 py-2 text-sm text-white bg-red-500 rounded" > Delete </button> </td> </tr> ))} {posts.length === 0 && ( <tr> <td className="px-6 py-4 border-t" colSpan="4" > No contacts found. </td> </tr> )} </tbody> </table> </div> </div> </div> </div> </Authenticated> ); }
Then visit to resources/js/Pages/Posts/ directory create create.jsx file. And update the following code into it:
import React from 'react'; import Authenticated from '@/Layouts/Authenticated'; import { Head, useForm, Link } from '@inertiajs/inertia-react'; export default function Dashboard(props) { const { data, setData, errors, post } = useForm({ title: "", description: "", }); function handleSubmit(e) { e.preventDefault(); post(route("posts.store")); } return ( <Authenticated auth={props.auth} errors={props.errors} header={<h2 className="font-semibold text-xl text-gray-800 leading-tight">Create Post</h2>} > <Head title="Posts" /> <div className="py-12"> <div className="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div className="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div className="p-6 bg-white border-b border-gray-200"> <div className="flex items-center justify-between mb-6"> <Link className="px-6 py-2 text-white bg-blue-500 rounded-md focus:outline-none" href={ route("posts.index") } > Back </Link> </div> <form name="createForm" onSubmit={handleSubmit}> <div className="flex flex-col"> <div className="mb-4"> <label className="">Title</label> <input type="text" className="w-full px-4 py-2" label="Title" name="title" value={data.title} onChange={(e) => setData("title", e.target.value) } /> <span className="text-red-600"> {errors.title} </span> </div> <div className="mb-0"> <label className="">Body</label> <textarea type="text" className="w-full rounded" label="body" name="body" errors={errors.body} value={data.body} onChange={(e) => setData("body", e.target.value) } /> <span className="text-red-600"> {errors.body} </span> </div> </div> <div className="mt-4"> <button type="submit" className="px-6 py-2 font-bold text-white bg-green-500 rounded" > Save </button> </div> </form> </div> </div> </div> </div> </Authenticated> ); }
Then visit to resources/js/Pages/Posts/ directory create edit.jsx file. And update the following code into it:
import React from 'react'; import Authenticated from '@/Layouts/Authenticated'; import { Head, useForm, usePage, Link } from '@inertiajs/inertia-react'; export default function Dashboard(props) { const { post } = usePage().props; const { data, setData, put, errors } = useForm({ title: post.title || "", body: post.body || "", }); function handleSubmit(e) { e.preventDefault(); put(route("posts.update", post.id)); } return ( <Authenticated auth={props.auth} errors={props.errors} header={<h2 className="font-semibold text-xl text-gray-800 leading-tight">Edit Post</h2>} > <Head title="Posts" /> <div className="py-12"> <div className="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div className="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div className="p-6 bg-white border-b border-gray-200"> <div className="flex items-center justify-between mb-6"> <Link className="px-6 py-2 text-white bg-blue-500 rounded-md focus:outline-none" href={ route("posts.index") } > Back </Link> </div> <form name="createForm" onSubmit={handleSubmit}> <div className="flex flex-col"> <div className="mb-4"> <label className="">Title</label> <input type="text" className="w-full px-4 py-2" label="Title" name="title" value={data.title} onChange={(e) => setData("title", e.target.value) } /> <span className="text-red-600"> {errors.title} </span> </div> <div className="mb-0"> <label className="">Body</label> <textarea type="text" className="w-full rounded" label="body" name="body" errors={errors.body} value={data.body} onChange={(e) => setData("body", e.target.value) } /> <span className="text-red-600"> {errors.body} </span> </div> </div> <div className="mt-4"> <button type="submit" className="px-6 py-2 font-bold text-white bg-green-500 rounded" > Update </button> </div> </form> </div> </div> </div> </div> </Authenticated> ); }
Now add posts module link on header navbar. Then update add following line on Authenticated.jsx file:
... <NavLink href={route('posts.index')} active={route().current('posts.index')}> Posts </NavLink> ...
Step 8 – Start Development Server
Finally, execute the following command on command line to start development server:
php artisan serve
Also keep run following command for vite:
npm run dev
If we want to build then you can run following command:
npm run build
Now, Go to web browser, type the following URL into it:
http://localhost:8000
Conclusion
Through this tutorial, we have learned how to make react crud with laravel 9 apps.
Recommended Laravel Tutorials