آموزش Laravel

آموزش insert اطلاعات فرم در لاراول

ثبت اطلاعات فرم در لاراول

در این مطلب آموزش insert اطلاعات فرم در لاراول را با استفاده از Eloquent در فریم ورک محبوب لاراول ارائه خواهیم داد.

درج اطلاعات فرم در لاراول

درج اطلاعات فرم در لاراول

 

همانطور که می دونید ما در پروژه های واقعی اطلاعات رو از یک فرم دریافت می کنیم، به همین خاطر در ابتدا من نیاز به یک فرم دارم اما قبل از اون باید با نحوه پیکربندی دیتابیس و ایجاد جداول در دیتابیس هم آشنا باشم، اگر هنوز این موارد رو نمی دونید در دسته مقاله های آموزش لاراول این مطالب رو مطالعه کنید.

جدولی به نام “posts” نیز با ساختار زیر در دیتابیسی به نام “laravelapp” ایجاد کردم.

جدول دیتابیس MySQL

جدول دیتابیس MySQL

 

از اونجا که برای کار با پردازش های دیتابیس و استفادهاز Eloquent نیاز به Model ها داریم، یک “Model” به نام “Post” در پروژه ساختم.

ما به دو روش می تونیم اطلاعات رو  از طریق ابزار Eloquent از فرم دریافت و در جدول دیتابیس ذخیره کنیم که در ادامه به آنها می پردازیم.

 

روش های ثبت اطلاعات فرم با استفاده از Eloquent در لاراول

  1. استفاده از Object
  2. استفاده از Model

هر کدام را با مثال توضیح خواهم داد.

 

1. آموزش ثبت اطلاعات فرم در لاراول (استفاده از Object Oriented PHP)

به صورت مرحله مرحله پیش میریم تا درک مطالب ساده تر باشه.

1) فرم خودم رو در فایلی به نام “create.blade.php” در مسیر زیر ایجاد کردم. 

resources -> views -> blog -> create.blade.php

برای استایل دهی از فریم ورک tailwind استفاده کردم، (آموزش نصب و پیکربندی Tailwind CSS در لاراول):

				
					<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    @vite('resources/js/app.js')
</head>
<body data-rsssl=1>
<div class="w-4/5 mx-auto">
    <div class="text-center pt-20">
        <h1 class="text-3xl text-gray-700">
            Add new post
        </h1>
        <hr class="border border-1 border-gray-300 mt-10">
    </div>

<div class="m-auto pt-20">
    <form
        action="{{ route('blog.store') }}"
        method="POST"
        enctype="multipart/form-data">
        @csrf

        <label for="is_published" class="text-gray-500 text-2xl">
            Is Published
        </label>
        <input
            type="checkbox"
            class="bg-transparent block border-b-2 inline text-2xl outline-none"
            name="is_published">

        <input
            type="text"
            name="title"
            placeholder="Title..."
            class="bg-transparent block border-b-2 w-full h-20 text-2xl outline-none">

        <input
            type="text"
            name="excerpt"
            placeholder="Excerpt..."
            class="bg-transparent block border-b-2 w-full h-20 text-2xl outline-none">

        <input
            type="number"
            name="min_to_read"
            placeholder="Minutes to read..."
            class="bg-transparent block border-b-2 w-full h-20 text-2xl outline-none">

        <textarea
            name="body"
            placeholder="Body..."
            class="py-20 bg-transparent block border-b-2 w-full h-60 text-xl outline-none"></textarea>
            
        <div class="bg-grey-lighter py-10">
            <label class="w-44 flex flex-col items-center px-2 py-3 bg-white-rounded-lg shadow-lg tracking-wide uppercase border border-blue cursor-pointer">
                    <span class="mt-2 text-base leading-normal text-black">
                        Select a file
                    </span>
                <input
                    type="file"
                    name="image"
                    class="hidden">
            </label>
        </div>

        <button
            type="submit"
            class="uppercase mt-15 bg-blue-500 text-gray-100 text-lg font-bold py-4 px-8 rounded-3xl">
            Submit Post
        </button>
    </form>
</div>
</body>
</html>
				
			

 

2) نیاز به یک کنترلر جهت مدیریت روت ها داریم به همین خاطر یک کنترلر با نام “PostController” ایجاد و کدهای زیر رو داخلش می نویسم.

				
					<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class PostController extends Controller
{
  
    public function index()
    {
        return view('blog.index' , ['posts'=> DB::table('posts')->orderBy('id', 'desc')->get()]);
    }

    public function create()
    {
        return view('blog.create');
    }

    public function store(Request $request)
    {
        //dd($request->all());
        $post = new Post();
        $post->title = $request->title;
        $post->excerpt = $request->excerpt;
        $post->body = $request->body;
        $post->image_path = 'temporary';
        $post->is_published = $request->is_published === 'on';
        $post->min_to_read = $request->min_to_read;
        $post->save();
        return redirect(route('blog.index'));
    }

   
    public function show($id)
    {
        return view('blog.show', [
            'post'=> Post::findOrFail($id)
        ]);
        //return $id;
    }

   
    public function edit($id)
    {
        //
    }

   
    public function update(Request $request, $id)
    {
        //
    }

   
    public function destroy($id)
    {
        //
    }
}

				
			

3) برای معرفی روت های کنترلر فایل “web.php” رو باز می کنم و بدین شکل متدها رو تعریف می کنم.

نکته مهم: روت مربوط به فرم یا insert اطالاعات باید در ابتدا معرفی شود و بعد سایر روت ها تعریف شوند. (خط کد 12)

				
					<?php

use App\Http\Controllers\FallbackController;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

Route::prefix('/blog')->group(function () {
    Route::get('/create', [PostController::class, 'create'])->name('blog.create');
    Route::get('/', [PostController::class, 'index'])->name('blog.index');
    Route::get('/{id}', [PostController::class, 'show'])->name('blog.show');
    Route::post('/', [PostController::class, 'store'])->name('blog.store');
    Route::get('/edit/{id}', [PostController::class, 'edit'])->name('blog.edit');
    Route::patch('/{id}', [PostController::class, 'update'])->name('blog.update');
    Route::delete('/{id}', [PostController::class, 'destroy'])->name('blog.destroy');
});

Route::get('/', HomeController::class);
Route::fallback(FallbackController::class);

 
				
			

اگر مراحل رو به درستی طی کرده باشید با اطلاعات فرم به درستی در جدول شما درج خواهند شد.

 

2. آموزش ثبت اطلاعات فرم در لاراول (استفاده از Model)

1) برای اینکار در مثال قبل فایل “PostController” رو باز کنید و متد بخش store رو به شکل زیر تغییر بدید.

				
					 public function store(Request $request)
    {
        Post::create([
            'title' => $request->title,
            'excerpt' => $request->excerpt,
            'body' => $request->body,
            'image_path' => 'temporary',
            'is_published' => $request->is_published === 'on',
            'min_to_read' => $request->min_to_read,
        ]);

        return redirect(route('blog.index'));
    }
				
			

2) در این روش لاراول برای اینکه داده ای به صورت تصادفی یا اشتباه درج نشه از ما می خواد که فیلدهای جدول رو به شکل “protexted” در Model خودمون تعریف کنیم. وارد فایل Modal ای که ایجاد کردم میشم (Post) و کدهای زیر رو می نویسم:

				
					<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    protected $fillable = [
        'title', 'excerpt', 'body', 'image_path', 'is_published', 'min_to_read'
    ];
}

				
			

ما در فرمی که ایجاد کردیم گزینه آپلود تصویر هم داریم، آپلود و ذخیزه سازی تصویر رو به چه شکل باید انجام بدیم؟

 

آپلود فایل و تصویر در لاراول

ما فایل ها رو به صورت مستقیم در دیتابیس ذخیره نمی کنیم، ابتدا آنها رو در پوشه ای مشخص ذخیره می کنیم و بعد مسیر و نام فایل رو در فیلد مربوطه در جدول دیتابیس درج می کنیم.

برای اینکار فایل کنترلر “PostController” رو باز کنید و در انتهای همه متدها یک متد جدید به شکل “private” که فقط برای دیافت و ذخیره کردن تصویر هست ایجاد می کنیم.

				
					  private function storeImage($request) {
  
        $newImageName = uniqid() . '-' . $request->title . '.' .
        $request->image->extension();

        return $request->image->move(public_path('images'), $newImageName);
    }
				
			

متد “store” رو هم به شکل زیر تغییر میدم:

				
					 public function store(Request $request)
    {
        Post::create([
            'title' => $request->title,
            'excerpt' => $request->excerpt,
            'body' => $request->body,
            'image_path' => $this->storeImage($request),
            'is_published' => $request->is_published === 'on',
            'min_to_read' => $request->min_to_read,
        ]);

        return redirect(route('blog.index'));
    }
				
			

در نهایت کدینگ فایل کنترلر “PostController” به شکل زیر خواهد بود.

				
					<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class PostController extends Controller
{
    
    public function index()
    {
       
        return view('blog.index' , ['posts'=> DB::table('posts')->orderBy('id', 'desc')->get()]);
       
    }

  
    public function create()
    {
        return view('blog.create');
    }

    
    public function store(Request $request)
    {
      
        Post::create([
            'title' => $request->title,
            'excerpt' => $request->excerpt,
            'body' => $request->body,
            'image_path' => $this->storeImage($request),
            'is_published' => $request->is_published === 'on',
            'min_to_read' => $request->min_to_read,
        ]);

        return redirect(route('blog.index'));
    }

  
    public function show($id)
    {
        
        return view('blog.show', [
            'post'=> Post::findOrFail($id)
        ]);
        //return $id;
    }

   
    public function edit($id)
    {
        //
    }

   
    public function update(Request $request, $id)
    {
        //
    }

  
    public function destroy($id)
    {
        //
    }

    private function storeImage($request) {

        $newImageName = uniqid() . '-' . $request->title . '.' .
        $request->image->extension();

        return $request->image->move(public_path('images'), $newImageName);
    }
}

				
			

و تمام!

 

جمع بندی

در این مقاله سعی کردم روش های دیافت و درج اطلاعات از فرم در لاراول رو به همراه مثال توضیح بدم. امیدوارم این مطلب براتون مفید واقع شده باشه.

لطفا اگر نظر و پیشنهادی در خصوص مطالب و پیشبرد آنها دارید خوشحال میشم در قسمت دیدگاه ها مطرح بفرمایید.

 

مقاله های آموزشی طراحی و برنامه نویسی وب

کاربرد HTML

 jQuery

جاوا اسکریپت در 1 ساعت

کاربرد CSS

آموزش ReactJS

صفر تا صد PHP

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *