TGViewer
| کانال توسعه‌دهندگان PHP | | کانال توسعه‌دهندگان PHP | @developixphp · 1.68K subscribers
Post #99 616
‏اصل Single Responsibility در کدهای PHP 🧱

یکی از مهم‌ترین اصول SOLID که روی تمیزی کد PHP تاثیر مستقیم دارد، Single Responsibility Principle (SRP) است؛ یعنی هر کلاس فقط یک دلیل برای تغییر داشته باشد.

وقتی همه‌چیز را در یک کلاس می‌ریزیم، بعد از مدتی هر تغییر کوچک تبدیل می‌شود به کابوس ریفکتور، با ده‌ها باگ پنهان 😅

نمونه کد بد (نقض SRP) 👇
<?php

class UserService
{
public function register(string $email, string $password): void
{
// 1) validation
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Invalid email');
}

if (strlen($password) < 8) {
throw new InvalidArgumentException('Weak password');
}

// 2) save to database
// imagine: DB queries here...

// 3) send welcome email
mail($email, 'Welcome', 'Thanks for registering');
}
}

در این کلاس، UserService هم validation انجام می‌دهد، هم کار دیتابیس، هم ارسال ایمیل. سه دلیل برای تغییر در یک کلاس؛ این یعنی خلاف SRP.

ریفکتور با SRP ✅
هر بخش را به مسئولیت خودش محدود می‌کنیم:

<?php

class UserValidator
{
public function validate(string $email, string $password): void
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Invalid email');
}

if (strlen($password) < 8) {
throw new InvalidArgumentException('Weak password');
}
}
}

class UserRepository
{
public function save(string $email, string $password): void
{
// persist user to DB (PDO / ORM / ...)
}
}

class Mailer
{
public function sendWelcome(string $email): void
{
// use real mailer here
}
}

class UserService
{
public function __construct(
private UserValidator $validator,
private UserRepository $repository,
private Mailer $mailer,
) {}

public function register(string $email, string $password): void
{
$this->validator->validate($email, $password);
$this->repository->save($email, $password);
$this->mailer->sendWelcome($email);
}
}

حالا:

• تغییر قوانین پسورد فقط روی UserValidator اثر دارد 🔐

• تغییر دیتابیس یا ORM فقط در UserRepository انجام می‌شود 🗄️

• سوییچ از mail() به مثلاً Symfony Mailer فقط در Mailer عوض می‌شود 📧

چرا این ساختار در پروژه واقعی PHP (مثلاً Laravel) جواب می‌دهد؟

در فریم‌ورک‌هایی مثل Laravel و Symfony همین ایده تکرار شده: Form Requestها برای validation، Repository / Model برای persistence، و Service / Mailer برای بیزنس لاجیک و ایمیل. SRP دقیقا پشت این تفکیک قرار دارد.

یک قدم ساده مثل جدا کردن validation و ایمیل از کلاس اصلی، کد را:

• قابل تست‌تر می‌کند (Unit Test روی هر کلاس جدا)

• قابل ریفکتورتر می‌کند

• خوانایی تیمی را بالا می‌برد

موقع نوشتن کلاس بعدی، فقط از خودت بپرس:
این کلاس دقیقاً مسئول چه کاری است؟ اگر جواب بیشتر از یک جمله شد، یعنی وقت ریفکتور است 😉

منابع پیشنهادی برای مطالعه بیشتر:
PHP The Right Way - SOLID
Single Responsibility Principle (Wikipedia)


🔖 #PHP #پی_اچ_پی #PHP #Clean_Code #SOLID #SRP #Architecture

👤 Developix

💎 Channel: @DevelopixPHP
  • 👍 3
  • ❤ 2
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 →