مرحله اول: نصب لاراول

برای ایجاد سریع یک CRUD ساده در Laravel 8 اول از همه ما باید یکبار Laravel را با استفاده از دستور زیر دریافت کنیم، برای این منظور ترمینال خط فرمان خود را باز کنید و دستور زیر را اجرا کنید:

composer create-project --prefer-dist laravel/laravel blog

مرحله دوم: تنظیمات پایگاه داده

در این مرحله، ما اطلاعات اتصال به پایگاه داده را که شامل نام پایگاه داده، نام کاربری و رمز عبور است را برای laravel 8 تنظیم می کنیم، برای این منظور فایل .env را باز کرده و جزئیات لازم را به صورت زیر پر می کنیم:

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=here your database name(blog)
DB_USERNAME=here database username(root)
DB_PASSWORD=here database password(root)

مرحله سوم: ساخت Migration

در لاراول برای ساخت استراکچر پایگاه داده از Migration بهرمند خواهیم شد، برای این منظور از خط فرمان زیر استفاده می کنیم.

php artisan make:migration create_products_table --create=products

بعد از اجرای خط فرمان بالا یک فایل در مسیر database/migrations ایجاد می گردد آن را بصورت زیر تغییر دهید، تا استراکچر جدول products در پایگاه داده شما ایجاد گردد:

<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('detail');
            $table->timestamps();
        });
    }
  
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

حال با اجرای خط فرمان زیر جدول پایگاه داده ایجاد خواهد شد.

php artisan migrate

مرحله چهارم: افزودن Route

برای ایجاد روت ها به مسیر زیر رفته و کد زیر را قرار می دهیم.

routes/web.php
use App\Http\Controllers\ProductController;
  
Route::resource('products', ProductController::class);

مرحله پنجم: تعریف Controller و Model

کنون در این مرحله باید یک کنترلر جدیدی تحت عنوان ProductController ایجاد کنیم، بنابراین دستور زیر را اجرا می کنیم تا یک کنترلر و مدل جدید ایجاد کنیم.

php artisan make:controller ProductController --resource --model=Product

پس از اجرای دستور زیر، پرونده جدیدی در این مسیر “app/Http/Controllers/ProductController.php” ایجاد خواهد شد، در این Controller به طور پیش فرض هفت methods بصورت پیش فرض وجود دارند که عبارتند از:

index()
create()
store()
show()
edit()
update()
destroy()

همانطور که اشاره شد متد های این کنترلر بصورت پیش فرض خالی هستند برای سرعت آموزش محنوای نهایی فایل ProductController.php به صورت زیر تغییر دهید:

app/Http/Controllers/ProductController.php
<?php
  
namespace App\Http\Controllers;
   
use App\Models\Product;
use Illuminate\Http\Request;
  
class ProductController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $products = Product::latest()->paginate(5);
    
        return view('products.index',compact('products'))
            ->with('i', (request()->input('page', 1) - 1) * 5);
    }
     
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('products.create');
    }
    
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'detail' => 'required',
        ]);
    
        Product::create($request->all());
     
        return redirect()->route('products.index')
                        ->with('success','Product created successfully.');
    }
     
    /**
     * Display the specified resource.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function show(Product $product)
    {
        return view('products.show',compact('product'));
    } 
     
    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function edit(Product $product)
    {
        return view('products.edit',compact('product'));
    }
    
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Product $product)
    {
        $request->validate([
            'name' => 'required',
            'detail' => 'required',
        ]);
    
        $product->update($request->all());
    
        return redirect()->route('products.index')
                        ->with('success','Product updated successfully');
    }
    
    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function destroy(Product $product)
    {
        $product->delete();
    
        return redirect()->route('products.index')
                        ->with('success','Product deleted successfully');
    }
}

بسیار خوب، بعد از تغییرات بالا به مسیر “app/Models/Product.php” مراجعه کرده و محتوای فایل Product.php بصورت زیر تغییر دهید:

app/Models/Product.php
<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class Product extends Model
{
    use HasFactory;
  
    protected $fillable = [
        'name', 'detail'
    ];
}

مرحله ششم: افزودن Blade فایل ها برای View

در آخرین مرحله باید فایلهای blade را در View ایجاد کنیم. این فایل ها عمدتا فایل های HTML و استراکچر طرح بوده و متغییر ها در آن جا نمایی خواهد شد، برای طبقه بندی بهتر این فایل ها را در فولدی به نام products در مسیر resources/views ایجاد خواهیم کرد این فایل ها به شرح زیر می باشند:

layout.blade.php
index.blade.php
create.blade.php
edit.blade.php
show.blade.php

بنابراین تک تک این فایل ها را بصورت زیر ایجاد می کنیم:

resources/views/products/layout.blade.php
<!DOCTYPE html>
<html>
<head>
    <title>Laravel 8 CRUD Application - uclass.ir</title>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.css" rel="stylesheet">
</head>
<body>
  
<div class="container">
    @yield('content')
</div>
   
</body>
</html>
resources/views/products/index.blade.php
@extends('products.layout')
 
@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>Laravel 8 CRUD Example from scratch - uclass.ir</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-success" href="{{ route('products.create') }}"> Create New Product</a>
            </div>
        </div>
    </div>
   
    @if ($message = Session::get('success'))
        <div class="alert alert-success">
            <p>{{ $message }}</p>
        </div>
    @endif
   
    <table class="table table-bordered">
        <tr>
            <th>No</th>
            <th>Name</th>
            <th>Details</th>
            <th width="280px">Action</th>
        </tr>
        @foreach ($products as $product)
        <tr>
            <td>{{ ++$i }}</td>
            <td>{{ $product->name }}</td>
            <td>{{ $product->detail }}</td>
            <td>
                <form action="{{ route('products.destroy',$product->id) }}" method="POST">
   
                    <a class="btn btn-info" href="{{ route('products.show',$product->id) }}">Show</a>
    
                    <a class="btn btn-primary" href="{{ route('products.edit',$product->id) }}">Edit</a>
   
                    @csrf
                    @method('DELETE')
      
                    <button type="submit" class="btn btn-danger">Delete</button>
                </form>
            </td>
        </tr>
        @endforeach
    </table>
  
    {!! $products->links() !!}
      
@endsection
resources/views/products/create.blade.php
@extends('products.layout')
  
@section('content')
<div class="row">
    <div class="col-lg-12 margin-tb">
        <div class="pull-left">
            <h2>Add New Product</h2>
        </div>
        <div class="pull-right">
            <a class="btn btn-primary" href="{{ route('products.index') }}"> Back</a>
        </div>
    </div>
</div>
   
@if ($errors->any())
    <div class="alert alert-danger">
        <strong>Whoops!</strong> There were some problems with your input.<br><br>
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
   
<form action="{{ route('products.store') }}" method="POST">
    @csrf
  
     <div class="row">
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Name:</strong>
                <input type="text" name="name" class="form-control" placeholder="Name">
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Detail:</strong>
                <textarea class="form-control" style="height:150px" name="detail" placeholder="Detail"></textarea>
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12 text-center">
                <button type="submit" class="btn btn-primary">Submit</button>
        </div>
    </div>
   
</form>
@endsection
resources/views/products/edit.blade.php
@extends('products.layout')
   
@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>Edit Product</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-primary" href="{{ route('products.index') }}"> Back</a>
            </div>
        </div>
    </div>
   
    @if ($errors->any())
        <div class="alert alert-danger">
            <strong>Whoops!</strong> There were some problems with your input.<br><br>
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif
  
    <form action="{{ route('products.update',$product->id) }}" method="POST">
        @csrf
        @method('PUT')
   
         <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Name:</strong>
                    <input type="text" name="name" value="{{ $product->name }}" class="form-control" placeholder="Name">
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Detail:</strong>
                    <textarea class="form-control" style="height:150px" name="detail" placeholder="Detail">{{ $product->detail }}</textarea>
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12 text-center">
              <button type="submit" class="btn btn-primary">Submit</button>
            </div>
        </div>
   
    </form>
@endsection
resources/views/products/show.blade.php
@extends('products.layout')
  
@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2> Show Product</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-primary" href="{{ route('products.index') }}"> Back</a>
            </div>
        </div>
    </div>
   
    <div class="row">
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Name:</strong>
                {{ $product->name }}
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Details:</strong>
                {{ $product->detail }}
            </div>
        </div>
    </div>
@endsection

اکنون ما آماده اجرای نمونه برنامه CRUD خود با laravel 8 هستیم ، بنابراین برای اجرای سریع دستور زیر را اجرا کنید:

php artisan serve

اکنون می توانید URL زیر را در مرورگر خود باز کنید:

http://localhost:8000/products
علاقه ام از سالها قبل برنامه نویسی تحت وب بوده و هست ، همیشه سعی می کنم علاقه مندی های خودم رو در ضمیه برنامه نویسی با همه به اشتراک بذارم، مطالب اینجا بتونه مشکل یه نفر رو هم برطرف کنه اون حس خوب رضایت رو در من بوجود میاره ;)

3 نظر برای ساخت سریع یک CRUD ساده در Laravel 8 ارسال شده است.

  1. Pejman mohammadi

    سلام ، من توی این بحث Form از Crud به مشکل خوردم .

    4 تا عکس از کد و اجرا میفرستم .

    :: کد های Create.blade.php

    http://s15.picofile.com/file/8409172650/1.JPG

    :: کد های :: PostsConteroller

    http://s14.picofile.com/file/8409172676/2.JPG

    :: کد های :: Web.php

    http://s14.picofile.com/file/8409172692/3.JPG

    ::کد اجرایی صفحه cms.test/posts/create

    http://s15.picofile.com/file/8409172718/4.JPG

    ——————————————————————————–

    لطفا جواب رو یه خورده سریع تر از حالت عادی بفرستید .

    شفاف و کامل باشه که بتونم متوجه بشم .

    • admin

      ضمن تشکر از ارسال نظر شما
      دوست عزیز این آموزش با Laravel 8 آماده و بررسی شده، لطفا یکبار crud مورد نظر خودتون رو مرحله به مرحله مطابق با آموزش ما پیش ببرید.
      در اسکرین شاتهایی که ارسال کردین این موارد رعایت نشده
      – اکشن فرم شما در فایل Create.blade.php به اشتباه تنظیم شده است.
      – با توجه به خطایی که دارید این احتمال وجود داره که در پایگاه داده شما فیلد id در حالت AUTO_INCREMENT تنظیم نشده است.

  2. مصطفی

    گام به گام انجام دادم در لاراول 8 اجرا شد و بسیار لذت بردم

ارسال نظر