ایده این پست بر اساس ترکیبی از مستند رسمی PHP و چند نمونهکار تمیز روی GitHub هست (مثل ریپوهای سبک login API با PDO). تمرکز روی اینه که یه ساختار تمیز، قابلگسترش و امنتر نسبت به کدهای قدیمی و procedural داشته باشیم.
سناریو 🔎
میخوای یه endpoint مثل
/api/login.php داشته باشی که:• JSON از کلاینت بگیره (email و password)
• یوزر رو توی دیتابیس MySQL چک کنه
• پسورد رو با
password_hash و password_verify هندل کنه• در جواب، JSON تمیز برگردونه
چند نکته مهم قبل از کد 🧠
• حتماً
PDO با prepared statement استفاده کن، نه query خام.• همیشه
Content-Type: application/json رو ست کن.• خطاها رو JSON برگردون، نه echo ساده.
نمونه ساختار ساده API لاگین 🧩
این یه مثال مینیمال و قابلاجراست (فرض بر اینه که جدول users با ستونهای id، email، password داری و پسوردها با
password_hash ذخیره شدن):<?php
// api/login.php
declare(strict_types=1);
header('Content-Type: application/json; charset=utf-8');
class DB
{
private \PDO $pdo;
public function __construct()
{
$dsn = 'mysql:host=localhost;dbname=myapp;charset=utf8mb4';
$user = 'db_user';
$pass = 'db_pass';
$this->pdo = new \PDO($dsn, $user, $pass, [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
]);
}
public function findUserByEmail(string $email): ?array
{
$stmt = $this->pdo->prepare('SELECT * FROM users WHERE email = :email LIMIT 1');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
return $user ?: null;
}
}
class LoginController
{
public function __construct(private DB $db) {}
public function handle(): void
{
$input = json_decode(file_get_contents('php://input'), true);
if (!isset($input['email'], $input['password'])) {
http_response_code(400);
echo json_encode(['error' => 'invalid_payload']);
return;
}
$user = $this->db->findUserByEmail($input['email']);
if (!$user || !password_verify($input['password'], $user['password'])) {
http_response_code(401);
echo json_encode(['error' => 'invalid_credentials']);
return;
}
echo json_encode([
'id' => (int) $user['id'],
'email' => $user['email'],
]);
}
}
$db = new DB();
$controller = new LoginController($db);
$controller->handle();
چرا این سبک خوبه؟ ⚙️
• کلاس DB جداست، بعداً راحت میتونی لاگ، کش یا تست واحد براش بنویسی.
• LoginController فقط روی لاجیک لاگین تمرکز داره، نه اتصال به دیتابیس.
• از
strict_types و type hint استفاده شده که با PHP مدرن هماهنگه.برای عمیقتر شدن توی این سبک، مستند رسمی PHP درباره PDO و همچنین بخش password hash و password_verify خیلی کمککننده است.
این ساختار کوچیک رو بردار، توی پروژههات امتحانش کن و با اضافه کردن token (مثلاً JWT) یا session، تبدیلش کن به یه auth کاملتر. تجربههات رو هم با بقیه توسعهدهندههای PHP به اشتراک بذار 🔧💬
🔖 #PHP #پی_اچ_پی #PHP #Login_API #PDO #OOP #Authentication #Backend
👤 Developix
💎 Channel: @DevelopixPHP