| کانال توسعه‌دهندگان PHP |
1.66K subscribers
48 photos
1 video
60 links
⭕️ کانال توسعه‌دهندگان پی‌اچ‌پی (PHP) دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
📌 ساخت یک REST API سبک با PHP خالص

خیلی وقت‌ها برای یک فرم ساده، اپ موبایل کوچک یا integration داخلی، لازم نیست کل Laravel را بالا بیاریم. یک API سبک با PHP خالص می‌تونه هم سریع باشه، هم قابل دیپلوی روی هر هاستی.

در این پست، یه نمونه خیلی عملی می‌بینیم که شبیه مثال‌های سرور داخلی PHP در مستندات رسمی کار می‌کنه؛ فقط کمی مرتب‌تر و مدرن‌تر 👇

💡 ایده اصلی

– استفاده از PHP 8+ با type hint و strict_types.
– هندل‌کردن GET /tasks و POST /tasks برای یک TODO ساده.
– استفاده از json_encode / json_decode با application/json.
– جداسازی لاجیک در یک کلاس کوچک (بدون شلوغ‌کاری).

🔧 ساختار پیشنهادی

– یک فایل public/index.php
– یک کلاس ساده برای مدیریت داده‌ها (فعلاً in-memory، بعداً راحت می‌شه به DB وصل کرد)


<?php

declare(strict_types=1);

// public/index.php

header('Content-Type: application/json; charset=utf-8');

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$uri = strtok($_SERVER['REQUEST_URI'] ?? '/', '?');

class TaskStore
{
private array $tasks = [];

public function all(): array
{
return array_values($this->tasks);
}

public function add(string $title): array
{
$id = uniqid('task_', true);
$task = [
'id' => $id,
'title' => $title,
];
$this->tasks[$id] = $task;
return $task;
}
}

$store = new TaskStore();

if ($uri === '/tasks' && $method === 'GET') {
echo json_encode($store->all(), JSON_UNESCAPED_UNICODE);
exit;
}

if ($uri === '/tasks' && $method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true) ?? [];

if (!isset($input['title']) || !is_string($input['title'])) {
http_response_code(422);
echo json_encode(['error' => 'title is required']);
exit;
}

$task = $store->add(trim($input['title']));

http_response_code(201);
echo json_encode($task, JSON_UNESCAPED_UNICODE);
exit;
}

http_response_code(404);
echo json_encode(['error' => 'Not Found']);


🚀 اجرا روی لوکال

با سرور داخلی PHP (مطابق داکیومنت رسمی):

php -S localhost:8000 -t public


حالا:
– با curl یا Postman روی /tasks تست کن.
– بعداً خیلی راحت می‌شه این ساختار رو به یک لایه Repository و اتصال به MySQL یا PostgreSQL گسترش داد.

🔥 چند نکته کاربردی

– همیشه Content-Type درست برای JSON ست کن تا client ها راحت‌تر parse کنن.
– برای پروژه واقعی، لاگ‌گرفتن و error handling مرکزی (مثلاً با یک middleware ساده) خیلی کمک می‌کنه.
– اگر این سبک رو دوست داشتی، نگاه‌کردن به سورس micro-frameworkهایی مثل Slim PHP ایده‌های خوبی برای routing و middleware می‌ده.

امروز همین نمونه کوچک رو روی سیستم خودت بالا بیار، کمی باهاش بازی کن و بعد شروع کن به اضافه‌کردن featureهای کوچیک 😉

🔖 #PHP #پی_اچ_پی #PHP #REST_API #Backend #Web #Tutorial

👤 Developix

💎 Channel: @DevelopixPHP
❤1
📨 ساخت یک فرم تماس امن با PHP 8 و PDO

خیلی وقت‌ها سریع یک فرم «ارتباط با ما» می‌نویسیم، ولی اگر درست هندل نشه، پر از مشکل امنیتی و باگ می‌شه؛ از SQL Injection گرفته تا اسپم و خطاهای عجیب. امروز یه نمونه‌ی خیلی کاربردی و مدرن با PHP 8 + PDO رو مرور می‌کنیم.

این ایده برگرفته از نمونه‌های رسمی و Best Practiceهای مستندات PHP و PDO هست:
php.net/manual/en/book.pdo.php

🔹 سناریو
فرض کن یه فرم ساده داریم: name، email و message. می‌خوایم داده‌ها رو:

• ولیدیت اولیه کنیم (خالی نبودن، ایمیل معتبر)
• امن ذخیره کنیم داخل MySQL با Prepared Statement
• خطاها رو لاگ کنیم، نه اینکه به کاربر Error خام نشون بدیم

🔹 ساخت جدول MySQL (یک‌بار روی DB اجرا کن)
CREATE TABLE contacts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
message TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


🔹 فایل process_contact.php
این نمونه از strict types، PDO و Exception Handling استفاده می‌کنه؛ مناسب PHP 8 به بالا:

<?php

declare(strict_types=1);

$dsn = 'mysql:host=127.0.0.1;dbname=demo_app;charset=utf8mb4';
$user = 'demo_user';
$pass = 'demo_pass';

try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
error_log('DB connection failed: ' . $e->getMessage());
http_response_code(500);
exit('Server Error');
}

$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');

$errors = [];

if ($name === '') {
$errors[] = 'نام الزامی است.';
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'ایمیل نامعتبر است.';
}

if ($message === '') {
$errors[] = 'متن پیام را وارد کنید.';
}

if ($errors) {
http_response_code(422);
echo implode("\n", $errors);
exit;
}

$sql = 'INSERT INTO contacts (name, email, message) VALUES (:name, :email, :message)';
$stmt = $pdo->prepare($sql);

$stmt->execute([
':name' => $name,
':email' => $email,
':message' => $message,
]);

echo 'پیام شما با موفقیت ثبت شد.';


✨ چند نکته‌ی ریز اما مهم

• استفاده از charset=utf8mb4 برای ساپورت ایموجی و متن‌های ترکیبی.
• فعال‌کردن PDO::ERRMODE_EXCEPTION باعث می‌شه خطاها رو مثل آدم مدیریت کنیم، نه با die() و متن خام.
• filter_var برای Validation ایمیل ساده و قابل فهمه؛ برای پروژه‌های بزرگ‌تر می‌شه از کتابخونه‌های قوی‌تر استفاده کرد.
• حتماً خروجی خطا به کاربر عمومی باشه و لاگ کامل فقط در error_log ذخیره بشه.

🌱 این الگو یه اسکلت تمیز برای هر نوع فرم (ثبت‌نام، کامنت، تیکت) تو پروژه‌های PHP محسوب می‌شه. یک بار تمیز پیاده‌سازی بشه، بعد می‌تونی هی رویش توسعه بدی (CSRF token، Rate Limit, Recaptcha و غیره).

امتحانش کن، روی پروژه‌ی واقعی استفاده کن و اگر باگ یا ایده‌ی بهتری داشتی، با بقیه توسعه‌دهنده‌های PHP به اشتراک بذار 💻

🔖 #PHP #پی_اچ_پی #PHP #PDO #MySQL #Form_Handling #Validation #Backend #Web_Development

👤 Developix

💎 Channel: @DevelopixPHP
👍2👎1
اگه برای هر صفحه‌ی پروژه‌ی PHP خودت یه فایل جدا مثل about.php، contact.php و ... می‌سازی، کم‌کم همه‌چی شلوغ و سخت‌قابل‌مدیریت می‌شه. یه Router ساده می‌تونه کل مسیرها رو تمیز و قابل‌گسترش کنه، حتی بدون استفاده از فریم‌ورکی مثل Laravel 👌

این پست بر اساس ایده‌ها و الگوی PSR-7 و نمونه‌های ساده‌ای مثل klein.php یه روتر سبک رو نشون می‌ده که به راحتی تو هر پروژه PHP 8 می‌تونی استفاده‌اش کنی.

ایده‌ی اصلی چیه؟

✅ همه‌ی request ها از یه index.php رد بشن (Front Controller)

✅ بر اساس REQUEST_METHOD و REQUEST_URI، تابع یا Controller مناسب صدا زده بشه

✅ کدهای صفحه‌ها به‌جای پخش شدن، در توابع/کلاس‌ها باشن

ساخت یک Router خیلی ساده

تو public روت پروژه، یه index.php بساز و کد زیر رو بذار:

<?php

declare(strict_types=1);

$routes = [
'GET' => [
'/' => function () {
echo 'Home Page';
},
'/about' => function () {
echo 'About Page';
},
],
'POST' => [
'/contact' => function () {
echo 'Form submitted';
},
],
];

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$uri = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);

if (isset($routes[$method][$uri])) {
$handler = $routes[$method][$uri];
$handler();
} else {
http_response_code(404);
echo '404 Not Found';
}


الان وقتی بری به / یا /about یا با POST بری به /contact، روترت دقیقا می‌دونه چی رو اجرا کنه 🙌

یه کم تمیزتر با کلاس

می‌تونی روتر رو تو یه کلاس بذاری (مثلا src/Router.php) و با composer و autoload استفاده‌اش کنی. نمونه‌ی خیلی شبیه به این ساختار رو تو پروژه‌های کوچیک GitHub مثل "simple-php-router" راحت پیدا می‌کنی و می‌تونی ایده بگیری.

چرا این کار مفیده؟

• اضافه کردن route جدید فقط با یه خط تو آرایه انجام می‌شه 🔧
• بعدا می‌تونی middleware، auth، یا JSON API رو راحت اضافه کنی
• قدم اولیه برای مهاجرت به معماری تمیزتر و نزدیک‌تر به استانداردهایی مثل PSR هست

امتحانش کن، یه پروژه کوچیک بساز و چند تا route تعریف کن. اگه برات مفید بود، برای بقیه‌ی PHP dev ها هم بفرست تا اون‌ها هم از این ساختار تمیزتر لذت ببرن 👨‍💻👩‍💻

🔖 #PHP #پی_اچ_پی #PHP #Routing #Web #Backend #Modern_PHP #PSR

👤 Developix

💎 Channel: @DevelopixPHP
👍5