اگه تا حالا خواستی یه لاگین سبک برای SPA، موبایل یا حتی فرم ساده خودت بسازی، یه API لاگین کوچیک با PHP خالص میتونه عالی باشه؛ مخصوصاً وقتی با سبک مدرن و OOP نوشته بشه 😊
ایده این پست بر اساس ترکیبی از مستند رسمی PHP و چند نمونهکار تمیز روی GitHub هست (مثل ریپوهای سبک login API با PDO). تمرکز روی اینه که یه ساختار تمیز، قابلگسترش و امنتر نسبت به کدهای قدیمی و procedural داشته باشیم.
سناریو 🔎
میخوای یه endpoint مثل
• JSON از کلاینت بگیره (email و password)
• یوزر رو توی دیتابیس MySQL چک کنه
• پسورد رو با
• در جواب، JSON تمیز برگردونه
چند نکته مهم قبل از کد 🧠
• حتماً
• همیشه
• خطاها رو JSON برگردون، نه echo ساده.
نمونه ساختار ساده API لاگین 🧩
این یه مثال مینیمال و قابلاجراست (فرض بر اینه که جدول users با ستونهای id، email، password داری و پسوردها با
چرا این سبک خوبه؟ ⚙️
• کلاس DB جداست، بعداً راحت میتونی لاگ، کش یا تست واحد براش بنویسی.
• LoginController فقط روی لاجیک لاگین تمرکز داره، نه اتصال به دیتابیس.
• از
برای عمیقتر شدن توی این سبک، مستند رسمی PHP درباره PDO و همچنین بخش password hash و password_verify خیلی کمککننده است.
این ساختار کوچیک رو بردار، توی پروژههات امتحانش کن و با اضافه کردن token (مثلاً JWT) یا session، تبدیلش کن به یه auth کاملتر. تجربههات رو هم با بقیه توسعهدهندههای PHP به اشتراک بذار 🔧💬
🔖 #PHP #پی_اچ_پی #PHP #Login_API #PDO #OOP #Authentication #Backend
👤 Developix
💎 Channel: @DevelopixPHP
ایده این پست بر اساس ترکیبی از مستند رسمی 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
👍3❤1