TGViewer
| کانال توسعه‌دهندگان PHP | | کانال توسعه‌دهندگان PHP | @developixphp · 1.68K subscribers
Post #101 562
اگه تا حالا خواستی یه لاگین سبک برای SPA، موبایل یا حتی فرم ساده خودت بسازی، یه API لاگین کوچیک با PHP خالص می‌تونه عالی باشه؛ مخصوصاً وقتی با سبک مدرن و OOP نوشته بشه 😊

ایده این پست بر اساس ترکیبی از مستند رسمی 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
More from @developixphp
  1. Sep 26, 2026این کد موقع اجرا چه خروجی‌ای می‌ده و مشکلش کجاست؟ 🔖 #PHP #پی_اچ_پی 👤 Developix 💎 Channe…
  2. Sep 25, 2026🔥 پکیج: قراردادهای ترجمه سیمفونی اگر کد PHP را برای چندزبانگی می‌نویسید، بهتر است منطق بر…
  3. Sep 16, 2026🚀 &rlm;LaraGram Brain منتشر شد! از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraG…
  4. Sep 11, 2026ارسال ایمیل تأیید ثبت‌نام، بازیابی رمز عبور یا نوتیفیکیشن سفارش، تقریباً توی هر پروژه‌ PHP…
  5. Sep 10, 2026برنامه نویسی سوکت در PHP بخش اول عبارت دیگر در ارتباط های غیر سوکت برای ارسال یک پالس از س…
  6. Aug 31, 2026🔥 پکیج: استاندارد PSR-11 برای Container استاندارد PSR-11 فقط یه interface مشترک برای Cont…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →