PHP CRUD Rest API with Docker

بیایید یک CRUD Rest API در PHP ایجاد کنیم، با استفاده از:
- لاراول (فریم ورک پی اچ پی)
- آهنگساز (مدیر بسته پی اچ پی)
- Postgres (پایگاه داده)
- داکر
- Docker Compose
به نام های مشابه توجه کنید!
⚠️ “Composer” یک مدیر بسته برای PHP است. برای نصب و مدیریت وابستگی ها در پروژه های PHP استفاده می شود. شبیه NPM در پروژه های Node.js است.
⚠️ “نوشتن” ابزاری برای تعریف و اجرای برنامه های Docker چند کانتینری است. این شبیه به Docker Compose در پروژه های Node.js است.
اگر نسخه ویدیویی را ترجیح می دهید:
https://www.youtube.com/watch?v=cdlHJeHVFW4
تمام کدها در مخزن GitHub موجود است (لینک در توضیحات ویدیو): https://youtube.com/live/cdlHJeHVFW4
🏁 معرفی
در اینجا طرحی از معماری برنامه ای که می خواهیم ایجاد کنیم آمده است:
ما 5 نقطه پایانی برای عملیات اصلی CRUD ایجاد خواهیم کرد:
- ايجاد كردن
- همه اش را بخوان
- یکی را بخوانید
- به روز رسانی
- حذف
👣 مراحل
ما با یک راهنمای گام به گام همراه خواهیم بود، بنابراین شما می توانید با آن همراه باشید.
در اینجا مراحل انجام می شود:
- پیش نیازها را بررسی کنید
- یک پروژه لاراول جدید ایجاد کنید
- برنامه را کد کنید
- پایگاه داده Postgres را با Docker اجرا کنید
- برنامه را با Docker Compose بسازید و اجرا کنید
- برنامه را با Postman و Tableplus تست کنید
💡 پیش نیازها
- php نصب شده (نسخه 8+)
- آهنگساز نصب شده (نسخه 2.5+)
- داکر نصب شده (نسخه 20.10+)
- [optional] کد VS نصب شده (یا هر IDE که ترجیح می دهید)
- [optional] لاراول cli
- [optional] پستچی یا هر ابزار تست API
- [optional] Tableplus یا هر سرویس گیرنده پایگاه داده
🚀 یک پروژه جدید لاراول ایجاد کنید
برای ایجاد یک پروژه جدید لاراول، از Laravel CLI استفاده می کنیم.
laravel new laravel-crud-api
این کار کمی طول می کشد، اما خروجی نهایی باید چیزی شبیه به این باشد:
اکنون وارد پوشه پروژه شوید:
cd laravel-crud-api
و پروژه را با IDE مورد علاقه خود باز کنید. اگر از VS Code استفاده می کنید، می توانید از دستور زیر استفاده کنید:
code .
با این کار پروژه باز می شود، ترمینال باز می شود و دستور زیر را اجرا می کند:
php artisan serve
و شما باید چیزی شبیه به این داشته باشید:
شما می توانید سرور را با Ctrl + C
.
اکنون آماده شروع کدنویسی هستیم.
👩💻 برنامه را کدگذاری کنید
برای کدنویسی برنامه دو مرحله وجود دارد:
- اتصال پایگاه داده را پیکربندی کنید
- مسیرهای Player، PlayerController و Player را ایجاد کنید
🔗 پیکربندی اتصال پایگاه داده
ما از Postgres به عنوان پایگاه داده خود استفاده خواهیم کرد. برای پیکربندی اتصال پایگاه داده، از .env
فایل.
فایل .env را باز کنید و خطوط 11-16 (DB_CONNECTION، DB_HOST، DB_PORT، DB_DATABASE، DB_USERNAME، DB_PASSWORD) را با موارد زیر جایگزین کنید (باید mysql
به صورت پیش فرض).
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432
DB_DATABASE=postgres
DB_USERNAME=postgres
DB_PASSWORD=postgres
فایل env نهایی شما باید به شکل زیر باشد:
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:EB/Rhl0udascxY9GVkIeHpoZT5LtivQlZpVvQp850QQ=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432
DB_DATABASE=postgres
DB_USERNAME=postgres
DB_PASSWORD=postgres
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
⚠️ توجه: توجه داشته باشید که به جای آدرس IP، از نام سرویس (db) به عنوان میزبان استفاده می کنیم. این به این دلیل است که ما از Docker Compose برای اجرای برنامه و پایگاه داده استفاده خواهیم کرد. به این ترتیب داکر می داند که چگونه این دو سرویس را به هم متصل کند (البته آنها باید در یک شبکه باشند).
📁 ساختار منبع را ایجاد کنید
یک را ایجاد خواهیم کرد Player
منبع این منبع دارای فیلدهای زیر خواهد بود:
- شناسه (افزایش خودکار)
- نام (رشته)
- ایمیل (رشته)
php artisan make:model Player -m
این یک فایل Player.php در App/Models و یک فایل create_players_table.php در پایگاه داده/migrations ایجاد کرد.
باز کن Player.php
فایل کنید و آن را با موارد زیر جایگزین کنید:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Player extends Model
{
use HasFactory;
//add name and email to fillable
protected $fillable = ['name', 'email'];
}
باز کن create_players_table.php
فایل را در پوشه پایگاه داده/migrations قرار دهید و آن را با موارد زیر جایگزین کنید:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('players', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('players');
}
};
حالا یک فایل به نام PlayerController.php در پوشه App/Http/Controllers ایجاد کنید و موارد زیر را اضافه کنید:
<?php
namespace App\Http\Controllers;
use App\Models\Player;
use Illuminate\Http\Request;
class PlayerController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//get all players
$players = Player::all();
//return JSON response with the players
return response()->json($players);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|string',
'email' => 'required|string',
]);
$player = Player::create($validatedData);
return response()->json($player, 201);
}
/**
* Display the specified resource.
*/
public function show(Player $player)
{
// return JSON response with the player
return response()->json($player);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Player $player)
{
$validatedData = $request->validate([
'name' => 'required|string',
'email' => 'required|string',
]);
$player->update($validatedData);
return response()->json($player, 200);
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Player $player)
{
$player->delete();
return response()->json(null, 204);
}
}
در آخر، فایل routes/api.php را باز کنید و موارد زیر را در بالای فایل اضافه کنید:
use App\Http\Controllers\PlayerController;
...
و این در پایین فایل:
...
Route::get('/players', [PlayerController::class, 'index']);
Route::post('/players', [PlayerController::class, 'store']);
Route::get('/players/{player}', [PlayerController::class, 'show']);
Route::put('/players/{player}', [PlayerController::class, 'update']);
Route::delete('/players/{player}', [PlayerController::class, 'destroy']);
فایل api.php باید به شکل زیر باشد:
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PlayerController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Route::get('/players', [PlayerController::class, 'index']);
Route::post('/players', [PlayerController::class, 'store']);
Route::get('/players/{player}', [PlayerController::class, 'show']);
Route::put('/players/{player}', [PlayerController::class, 'update']);
Route::delete('/players/{player}', [PlayerController::class, 'destroy']);
🐳 داکرسازی
حالا بیایید اپلیکیشن را dockerize کنیم. برای اجرای برنامه از docker-compose استفاده خواهیم کرد.
ما یک Dockerfile و یک فایل docker-compose.yml ایجاد خواهیم کرد.
🐋 داکرفایل
یک فایل جدید به نام ایجاد کنید Dockerfile
در ریشه پروژه
مطالب زیر را اضافه کنید (توضیحات در نظرات موجود است):
FROM php:8.1
RUN apt-get update && apt-get install -y \
libpq-dev \
&& docker-php-ext-install pdo pdo_pgsql
WORKDIR /var/www/html
COPY . .
RUN chown -R www-data:www-data \
/var/www/html/storage \
/var/www/html/bootstrap/cache
CMD php artisan serve --host=0.0.0.0 --port=8000
توضیح Dockerfile:
-
FROM php:8.1
: این تصویر پایه ای است که ما استفاده خواهیم کرد. ما از تصویر رسمی php با نسخه 8.1 استفاده خواهیم کرد. -
RUN apt-get update && apt-get install -y \
: این دستوری است که هنگام ساخت تصویر اجرا می شود. ما مدیر بسته apt را به روز می کنیم و بسته libpq-dev را نصب می کنیم. -
RUN docker-php-ext-install pdo pdo_pgsql
: این دستوری است که هنگام ساخت تصویر اجرا می شود. پسوند pdo و pdo_pgsql را نصب می کنیم. -
WORKDIR /var/www/html
: این دایرکتوری کاری کانتینر است. تمامی دستورات از این دایرکتوری اجرا خواهند شد. -
COPY . .
: این دستوری است که هنگام ساخت تصویر اجرا می شود. ما تمام فایل ها را از دایرکتوری فعلی به دایرکتوری کاری کانتینر کپی می کنیم. -
RUN chown -R www-data:www-data \
: این دستوری است که هنگام ساخت تصویر اجرا می شود. ما مالک دایرکتوری های ذخیره سازی و بوت استرپ/کش را به www-data تغییر می دهیم. -
CMD php artisan serve --host=8000
: این دستوری است که هنگام راه اندازی کانتینر اجرا می شود. دستور php artisan serve را شروع می کنیم.
🐙 docker-compose.yml
بیایید ایجاد کنیم docker-compose.yml
فایل در ریشه پروژه
مطالب زیر را اضافه کنید:
version: '3'
services:
laravelapp:
container_name: laravelapp
image: francescoxx/laravelapp:1.0.0
build: .
ports:
- "8000:8000"
env_file:
- .env
depends_on:
- db
db:
container_name: db
image: postgres:12
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data: {}
توضیح فایل docker-compose.yml:
-
version: '3'
: این نسخه فایل docker-compose است. -
services:
: این قسمتی است که ما سرویس هایی را که می خواهیم اجرا کنیم تعریف می کنیم. -
laravelapp:
: این نام سرویس است. -
container_name: laravelapp
: این نام ظرف است. -
image: francescoxx/laravelapp:1.0.0
: این نام تصویری است که از آن استفاده خواهیم کرد. از تصویری که در مرحله قبل ایجاد کردیم استفاده خواهیم کرد. جایگزین کردنfrancescoxx
با نام کاربری DockerHub شما -
build: .
: این مسیر Dockerfile است. ما از Dockerfile که در مرحله قبل ایجاد کردیم استفاده خواهیم کرد. -
ports:
: این قسمتی است که پورت هایی را که می خواهیم در معرض نمایش قرار دهیم را تعریف می کنیم. -
- "8000:8000"
: این همان پورتی است که میخواهیم آن را افشا کنیم. پورت 8000 کانتینر را در معرض پورت 8000 میزبان قرار می دهیم. -
env_file:
: این قسمتی است که در آن متغیرهای محیطی را که می خواهیم استفاده کنیم را تعریف می کنیم. -
- .env
: این مسیر فایل .env است. ما از فایل .env که در مرحله قبل ایجاد کردیم استفاده خواهیم کرد. -
depends_on:
: این قسمتی است که ما سرویس هایی را که می خواهیم قبل از این اجرا کنیم تعریف می کنیم. -
- db
: این نام سرویسی است که می خواهیم قبل از این اجرا کنیم. -
db:
: این نام سرویس است. -
container_name: db
: این نام ظرف است. -
image: postgres:12
: این نام تصویری است که از آن استفاده خواهیم کرد. ما از تصویر رسمی postgres با نسخه 12 استفاده خواهیم کرد. -
ports:
: این قسمتی است که پورت هایی را که می خواهیم در معرض نمایش قرار دهیم را تعریف می کنیم. -
- "5432:5432"
: این همان پورتی است که میخواهیم آن را افشا کنیم. پورت 5432 کانتینر را در معرض پورت 5432 میزبان قرار می دهیم. -
environment:
: این قسمتی است که در آن متغیرهای محیطی را که می خواهیم استفاده کنیم را تعریف می کنیم.
اکنون زمان ساخت تصویر و اجرای سرویس ها (کانتینرها) است.
پروژه را بسازید و اجرا کنید
اکنون می توانیم پروژه را بسازیم و اجرا کنیم.
💽 پایگاه داده Postgres را اجرا کنید
ابتدا باید پایگاه داده Postgres را اجرا کنیم.
docker compose up -d db
برای بررسی اینکه آیا در حال اجرا است، می توانید از دستور زیر استفاده کنید:
docker compose logs
و
docker ps -a
اگر خروجی مانند خروجی زیر است، خوب است که بروید:
شما باید چنین چیزی را ببینید، شما خوب هستید که بروید.
به عنوان آزمایش اضافی، می توانید با استفاده از TablePlus (یا هر مشتری پایگاه داده دیگر) به پایگاه داده متصل شوید.
می توانید با استفاده از پارامترهای زیر یک اتصال جدید ایجاد کنید:
- میزبان: localhost
- بندر: 5432
- پایگاه داده: postgres
- کاربر: postgres
- رمز عبور: postgres
سپس بر روی آن کلیک کنید Test Connection
دکمه. پایگاه داده متصل است اما در حال حاضر خالی است.
🏗️ پروژه را بسازید
برای ساخت پروژه، تایپ کنید:
docker compose build
و خروجی باید چیزی شبیه به این باشد:
🏃♂️ پروژه را اجرا کنید
اکنون می توانیم پروژه را اجرا کنیم.
docker compose up laravelapp
و این باید خروجی باشد:
💽 مهاجرت ها را اعمال کنید
اکنون باید مهاجرت ها را اعمال کنیم.
docker compose exec laravelapp php artisan migrate
اکنون زمان آزمایش پروژه است.
🧪 پروژه را تست کنید
اکنون می توانیم پروژه را آزمایش کنیم. ما از Postman استفاده خواهیم کرد، اما شما می توانید از هر ابزار دیگری استفاده کنید.
📝 یک پخش کننده بسازید
برای ایجاد یک پخش کننده جدید، یک را بسازید POST request to localhost:8000/api/player
.
بدنه درخواست باید به این صورت باشد:
{
"name": "aaa",
"email": "aaa@mail"
}
خروجی باید چیزی شبیه به این باشد:
بیایید دو بازیکن دیگر ایجاد کنیم، یک POST request to localhost:8000/api/player
.
{
"name": "bbb",
"email": "bbb@mail"
}
{
"name": "ccc",
"email": "ccc@mail"
}
📝 همه بازیکنان را دریافت کنید
برای به دست آوردن همه بازیکنان، یک را بسازید GET request to localhost:8000/api/player
.
خروجی باید چیزی شبیه به این باشد:
📝 یک بازیکن بگیرید
برای به دست آوردن یک بازیکن، یک GET request to localhost:8000/api/players/{id}
.
مثلا GET request to localhost:8000/api/players/1
.
خروجی باید چیزی شبیه به این باشد:
📝 یک پخش کننده را به روز کنید
برای به روز رسانی یک پخش کننده، یک را ایجاد کنید PUT request to localhost:8000/api/players/{id}
.
مثلا PUT request to localhost:8000/api/players/2
.
بدنه درخواست باید به این صورت باشد:
{
"name": "NEW",
"email": "MODIFIED@mail"
}
خروجی باید چیزی شبیه به این باشد:
📝 یک بازیکن را حذف کنید
برای حذف یک کاربر، یک علامت بزنید DELETE request to localhost:8000/api/players/{id}
.
مثلا DELETE request to localhost:8000/api/players/1
.
در پستچی باید چیزی شبیه به آن را ببینید:
تست نهایی
به عنوان تست نهایی، می توانیم پایگاه داده را با استفاده از TablePlus بررسی کنیم.
با استفاده از پارامترهای زیر یک اتصال جدید ایجاد کنید:
میزبان: localhost
بندر: 5432
پایگاه داده: postgres
کاربر: postgres
رمز عبور: postgres
سپس بر روی آن کلیک کنید Connect
دکمه در پایین سمت راست
همانطور که می بینید، ما یک players
جدول با 2 رکورد:
🏁نتیجه گیری
ما ساختیمش! ما یک CRUD Rest API در PHP ساختهایم که با استفاده از:
- لاراول (فریم ورک پی اچ پی)
- آهنگساز (مدیر بسته پی اچ پی)
- Postgres (پایگاه داده)
- داکر
- Docker Compose
اگر نسخه ویدیویی را ترجیح می دهید:
https://www.youtube.com/watch?v=cdlHJeHVFW4
تمام کدها در مخزن GitHub موجود است (لینک در توضیحات ویدیو): https://youtube.com/live/cdlHJeHVFW4
همین.
اگر سوالی دارید، در زیر نظر دهید.
فرانچسکو