تیم لاراول هر شش ماه یک بار، اقدام به ارائه یک نسخه جدید میکنند. در زمان نگارش این مطلب، آخرین نسخه، لاراول 8 نام دارد که قبلاً در ۸ سپتامبر ۲۰۲۰ میلادی ارائه شده است. در این آموزش، نحوه ساخت یک اپلیکیشن CRUD را با لاراول 8 برای ایجاد، وارد کردن، بروزرسانی و حذف محصولات در یک پایگاه داده MySQL فراخواهیم گرفت.
لاراول (Laravel) یکی از محبوبترین فریمورکهای مبتنی بر PHP برای ساخت اپلیکیشنهای دیتابیس-محور است. لاراول بر اساس الگوی MVC توسعه داده شده و میتواند به راحتی برای ساخت اپلیکیشنها و اجرای عملیات ایجاد، بازیابی، بروزرسانی و حذف موسوم به CRUD بر روی یک پایگاه داده مورد استفاده قرار گیرد.
لاراول دارای جامعه گستردهای از توسعهدهندگان است که توانستهاند تاکنون بستههای زیادی برای مسائل رایج توسعه وب ارائه کنند. بنابراین، توسعه دهندگان در بسیاری از موارد، نیازی به انجام کارهای اولیه نخواهند داشت.
پیشنیازهای لاراول 8
برای پیش بردن مراحل این آموزش نیاز است که موارد زیر را در اختیار داشته باشید.
- نصب PHP و MySQL در سیستم توسعهدهنده
- کمپوزر
گام ۱) نصب لاراول 8
با نصب لاراول 8 از طریق کمپوزر شروع میکنیم. یک رابط خط فرمان باز کنید و فرمان زیر را در آن اجرا نمایید.
$ composer create-project laravel/laravel=8.0 laravel8app --prefer-dist
لاراول 8 دارای برخی عملکردهای جدید است. به عنوان مثال، نیازی به کپیکردن و تغییر نام فایل env.example نخواهیم و خودِ لاراول این کار را برایمان انجام میدهد. همچنین تولید APP_KEY به صورت اتوماتیک صورت میگیرد.
صبر کنید تا کمپوزر سایر متعلقات را نصب کند. سپس پروژه خود را تنظیم کنید و برای مرحله بعد آماده شوید.
گام ۲) آمادهسازی یک پایگاه داده MySQL
حالا نوبت ساخت یک پایگاه داده MySQL برای ذخیرهسازی دادههای اپلیکیشن لاراول است. در ترمینال، فرمان زیر را تایپ کنید تا کلاینت mysql اجرا شود.
$ mysql -u root -p
زمانی که از شما درخواست شد، پسورد نصب سرور MySQL را وارد کنید.
سپس عبارت SQL زیر را اجرا کنید تا یک پایگاه db برایتان ساخته شود.
mysql> create database db;
فایل .env را باز کنید و مجوّزهای لازم را برای دسترسی به پایگاه داده MySQL تغییر دهید.
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=db DB_USERNAME=root DB_PASSWORD=******
در اینجا باید نام پایگاه داده، نام کاربری و کلمه عبور را تنظیم کنید.
در این مقطع، میتوانید با اجرای فرمان migrate، پایگاه داده و یک سری جداول SQL موردنیاز لاراول را بسازید.
$ php artisan migrate
نکته: در هر کدام از مقاطع دیگر توسعه نیز میتوانید فرمان migrate را برای اضافهکردن جداول دیگر SQL اجرا کنید. بنابراین امکان انجام تغییرات در این زمینه برایتان وجود خواهد داشت.
گام ۳) ایجاد یک Database Migration
ما در حال ساخت یک اپلیکیشن CRUD با لاراول 8 برای یک سری محصولات هستیم. بنابراین نیاز به ایجاد جدول SQL متناظر با آنها در پایگاه داده با استفاده از یک migration خواهیم داشت.
بر این اساس، به ترمینال برگشته و فرمانهای زیر را اجرا کنید.
$ cd laravel8app $ php artisan make:migration create_products_table --create=products
در نتیجه یک فایل migration درون فولدر database/migrations ایجاد خواهد شد. در ادامه، باید فیلدهای موردنیاز را در جدول پایگاه داده وارد کنیم. هر کدام از محصولات دارای یک عنوان، توضیح، قیمت، تاریخ تولید و زمان بروزرسانی است.
برای این منظور، فایل 2020_09_12_222716_create_products_table.php را که حاوی کلاس migration است باز کنید و آن را به صورت زیر بروزرسانی کنید.
<?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', 255)->nullable(); $table->string('description', 500)->nullable(); $table->decimal('price', 22)->nullable()->default(0.00); $table->timestamp('created_at')->useCurrent(); $table->timestamp('updated_at')->nullable(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('products'); } }
برای جلوگیری از پیغامهای خطا، باید ابتدا طول پیشفرض رشتهها را تنظیم کنید. برای این منظور، فایل app/Providers/AppServiceProvider.php را باز کرده و آیتم Schema::defaultstringLength(191) را مطابق زیر اضافه کنید.
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); } }
سپس دوباره به ترمینال برگردید و فرمان زیر را اجرا کنید.
$ php artisan migrate
در نتیجه، فیلدها به جدول پایگاه داده ما اضافه میشوند.
گام ۴) اضافهکردن مسیر منبع
در این مرحله باید مسیرهای موردنیاز برای عملیات CRUD را اضافه کنیم. برای این منظور، فایل routes\web.php را باز کنید و مسیر منبع را مطابق زیر وارد نمایید.
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\ProductController; Route::get('/', function () { return view('welcome'); }); Route::resource('products', ProductController::class);
گام ۵) اضافهکردن کنترلر و مدل لاراول 8
با کمک فرمان زیر، مدل و کنترلر لاراول را ایجاد میکنیم:
$ php artisan make:controller ProductController --resource --model=Product
در اینجا، از شما خواسته میشود که در صورت تمایل، مدل محصول را بسازید؛ چرا که در حال حاضر این مدل وجود ندارد. برای تأیید این موضوع، کلمه yes را تایپ کنید.
سپس فایل 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', 'description' => 'required', 'price' => 'required' ]); Product::create($request->all()); return redirect()->route('products.index') ->with('success', 'Product created successfully.'); } /** * Display the specified resource. * * @param \App\Models\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\Models\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\Models\product $product * @return \Illuminate\Http\Response */ public function update(Request $request, Product $product) { $request->validate([ 'name' => 'required', 'description' => 'required', 'price' => 'required' ]); $product->update($request->all()); return redirect()->route('products.index') ->with('success', 'Product updated successfully'); } /** * Remove the specified resource from storage. * * @param \App\Models\Product $product * @return \Illuminate\Http\Response */ public function destroy(Product $product) { $product->delete(); return redirect()->route('products.index') ->with('success', 'Product deleted successfully'); } }
لاراول 8 از فولدر Models برای ذخیرهسازی فایلهای مدل استفاده خواهد کرد.
حالا فایل app/Models/Product.php را باز کنید. در اینجا باید توابع و fillable را به صورت زیر اضافه کنید. fillable ها فیلدهایی در پایگاه داده هستند که کاربر میتواند آنها را پُر کند.
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Product extends Model { use HasFactory; protected $table = 'products'; public $timestamps = true; protected $casts = [ 'price' => 'float' ]; protected $fillable = [ 'name', 'description', 'price', 'created_at' ]; }
گام ۶) اضافهکردن Blade Views لاراول 8
لاراول از سیستم قالببندی blade برای ویوها استفاده میکند. بر این اساس، درون فولدر resources/views، دو فولدر Layouts و Products را ایجاد کنید.
اکنون محتوای فایل Layouts/App.blade.php را به صورت زیر بروزرسانی کنید.
<html> <head> <title>App Name - @yield('title')</title> <!-- Bootstrap --> <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.css" rel="stylesheet"> <!-- Font Awesome JS --> <script defer src="https://use.fontawesome.com/releases/v5.0.13/js/solid.js" integrity="sha384-tzzSw1/Vo+0N5UhStP3bvwWPq+uvzCMfrN1fEFe+xBmv1C/AtVX5K0uZtmcHitFZ" crossorigin="anonymous"> </script> <script defer src="https://use.fontawesome.com/releases/v5.0.13/js/fontawesome.js"integrity="sha384-6OIrr52G08NpOFSZdxxz1xdNSndlD4vdcf/q2myIUVO0VsqaGHJsB0RaBE01VTOY" crossorigin="anonymous"> </script> <style> .footer { position: fixed; left: 0; bottom: 0; width: 100%; background-color: #9C27B0; color: white; text-align: center; } </style> </head> <body> @section('sidebar') @show <div class="container"> @yield('content') </div> </body> </html>
همچنین فایل Index.blade.php را نیز به صورت زیر بروزرسانی کنید.
@extends('layouts.app') @section('content') <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2>Laravel 8 CRUD Example </h2> </div> <div class="pull-right"> <a class="btn btn-success" href="" title="Create a product"> <i class="fas fa-plus-circle"></i> </a> </div> </div> </div> @if ($message = Session::get('success')) <div class="alert alert-success"> <p></p> </div> @endif <table class="table table-bordered table-responsive-lg"> <tr> <th>No</th> <th>Name</th> <th>description</th> <th>Price</th> <th>Date Created</th> <th>Actions</th> </tr> @foreach ($products as $product) <tr> <td></td> <td></td> <td></td> <td></td> <td></td> <td> <form action="" method="POST"> <a href="" title="show"> <i class="fas fa-eye text-success fa-lg"></i> </a> <a href=""> <i class="fas fa-edit fa-lg"></i> </a> @csrf @method('DELETE') <button type="submit" title="delete" style="border: none; background-color:transparent;"> <i class="fas fa-trash fa-lg text-danger"></i> </button> </form> </td> </tr> @endforeach </table> {!! $products->links() !!} @endsection
فایل Index.blade.php نیز باید به صورت زیر بروزرسانی شود.
@extends('layouts.app') @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="" title="Go back"> <i class="fas fa-backward "></i> </a> </div> </div> </div> @if ($errors->any()) <div class="alert alert-danger"> <strong>Error!</strong> <ul> @foreach ($errors->all() as $error) <li></li> @endforeach </ul> </div> @endif <form action="" 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>Description:</strong> <textarea class="form-control" style="height:50px" name="introduction" placeholder="description"></textarea> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Price:</strong> <input type="number" name="price" class="form-control" placeholder="Put the price"> </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
تغییرات فایل edit.blade.php نیز به صورت زیر خواهد بود.
@extends('layouts.app') @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="" title="Go back"> <i class="fas fa-backward "></i> </a> </div> </div> </div> @if ($errors->any()) <div class="alert alert-danger"> <strong>Error!</strong> <ul> @foreach ($errors->all() as $error) <li></li> @endforeach </ul> </div> @endif <form action="" 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="" class="form-control" placeholder="Name"> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Description</strong> <textarea class="form-control" style="height:50px" name="description" placeholder="description"></textarea> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Price</strong> <input type="number" name="price" class="form-control" placeholder="" value=""> </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
فایل show.blade.php را نیز باز کرده و آن را مطابق زیر بروزرسانی کنید.
@extends('layouts.app') @section('content') <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2> </h2> </div> <div class="pull-right"> <a class="btn btn-primary" href="" title="Go back"> <i class="fas fa-backward "></i> </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> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Description</strong> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Price</strong> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Date Created</strong> </div> </div> </div> @endsection
به این ترتیب، کار راهاندازی اپلیکیشن Laravel 8 CRUD ما به پایان میرسد. در این حالت، میتوانید این اپلیکیشن را با استفاده از فرمان زیر به کار بگیرید.:
$ php artisan serve
همچنین میتوانید از آدرس http://127.0.0.1:8000 به اپلیکیشن خود دسترسی پیدا کنید.