TGViewer
| AmirHossein | | AmirHossein | @amirhdeveloper · 610 subscribers
Post #81 115
#design_patterns
دیزان پترن Dependency Injection یکی از دیزان پترن های نرم‌افزاری است که به کاهش وابستگی‌ها (Dependencies) در بین کلاس‌ها کمک می‌کند. این الگو، از جمله اصول اصلی SOLID است که به عنوان یک راهنمای خوب برای طراحی کد قابل‌خواندن، قابل‌تغییر و قابل‌تست در نظر گرفته می‌شود.

فرض کنید که شما یک کلاس برای ارسال ایمیل در برنامه خود دارید. این کلاس ممکن است نیاز به ارتباط با سرویس‌های ارسال ایمیل مختلف داشته باشد، مانند ارسال ایمیل از طریق SMTP یا از طریق API‌ های خارجی. اما شما نمی‌خواهید که کلاس اصلی ایمیل وابستگی مستقیم به این سرویس‌ها داشته باشد. بلکه می‌خواهید وابستگی‌ها را به شکلی منعطف و از خارج کلاس تعریف کنید.

مثال:

به جای اینکه کلاس ایمیل از خود به دلیل نیاز به سرویس‌های ارسال ایمیل، این وابستگی‌ها را بخود ایجاد کند، آن‌ها به عنوان پارامترهایی از طریق کانستراکتور دریافت می‌کند.
class EmailSender {
private $mailer;

public function __construct(MailerInterface $mailer) {
$this->mailer = $mailer;
}

public function sendEmail($to, $subject, $body) {
// Send email using $this->mailer
// ...
}
}

ابتدا یک Interface برای سرویس ارسال ایمیل تعریف می‌کنیم که تمام کلاس‌هایی که می‌خواهیم از آن‌ها استفاده کنیم، باید از این Interface ارث‌بری کنند.
interface MailerInterface {
public function send($to, $subject, $body);
}

حالا می‌توانیم کلاس‌های مختلفی برای سرویس‌های ارسال ایمیل ایجاد کنیم که از اینترفیس MailerInterface ارث‌بری می‌کنند.
class SmtpMailer implements MailerInterface {
public function send($to, $subject, $body) {
// Send email via SMTP
}
}

class ExternalApiMailer implements MailerInterface {
public function send($to, $subject, $body) {
// Send email via external API
}
}

// etc. for other email delivery services

حالا می‌توانیم در زمان ایجاد شئ ایمیل، یکی از سرویس‌های ارسال ایمیل را به عنوان وابستگی تزریق کنیم.
// Use SmtpMailer
$smtpMailer = new SmtpMailer();
$emailSender = new EmailSender($smtpMailer);
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body');

// Use ExternalApiMailer
$externalApiMailer = new ExternalApiMailer();
$emailSender = new EmailSender($externalApiMailer);
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body');

در این مثال، با استفاده از دیزاین پترن Dependency Injection، کلاس ایمیل از خود وابستگی به سرویس‌های ارسال ایمیل را حذف کرده است و به جای آن از پارامترهای تزریق شده از طریق کانستراکتور برای ارتباط با سرویس‌ها استفاده می‌کند. این کار باعث می‌شود که کلاس ایمیل قابل‌تغییر و باز است و ما می‌توانیم به راحتی سرویس‌های دیگر را برای ارسال ایمیل به برنامه اضافه کنیم بدون نیاز به تغییر در کلاس ایمیل خود. همچنین، این الگو به ما کمک می‌کند که کلاس‌هایمان را قابل‌تست کنیم.

ادامه در پست بعدی ...
.
More from @amirhdeveloper
  1. Sep 30, 2026پکیج LaraGram Sentinel منتشر شد؛ یک پنل مانیتورینگ که هیچ چیزی از زیر دستش در نمی‌ره! تمام…
  2. Sep 23, 2026از امروز با کاهش شدید حاکرها مواجه میشیم
  3. Sep 19, 2026🔴 سوال سوم دو Region دارید: US-East و EU-West. کاربران در هر دو Region هستند. سیستم باید…
  4. Sep 19, 2026🟠 سوال دوم فرض کنید Service A به Service B درخواست می‌زند. B به‌دلیل overload، latency با…
  5. Sep 19, 2026🟢 سوال اول فرض کنید یک سرویس backend داریم که به PostgreSQL وصل می‌شود. تعداد requestها ن…
  6. Sep 19, 2026خیلی وقته پست‌های کانال فقط درمورد LaraGram بوده، وقتشه یکم جالب‌ترش کنیم اگر ممبرها هنوز…
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 →