TGViewer
| کانال توسعه‌دهندگان لاراول | | کانال توسعه‌دهندگان لاراول | @developixlaravel · 1.54K subscribers
Post #172 680
ساخت Service Layer در لاراول برای تمیز نگه‌داشتن Controllerها 🧼

یکی از شایع‌ترین مشکلات در پروژه‌های لاراول این است که Controllerها پر از منطق تجاری (Business Logic) می‌شوند؛ نتیجه‌اش کلاس‌های چاق، سخت‌قابل‌تست و به‌هم‌ریخته است.

یک راه‌حل استاندارد و پرکاربرد، استفاده از Service Layer است؛ یعنی منطق اصلی را از Controller بیرون بکشیم و داخل Serviceهای مجزا قرار بدهیم. این رویکرد در پروژه‌های متوسط و بزرگ به‌شدت روی مقیاس‌پذیری و تست‌پذیری تاثیر مثبت دارد. 💡

مثال ساده: ثبت کاربر با منطق داخل Controller (کد ناخوانا و شلوغ)

class RegisterController extends Controller
{
public function store(Request $request)
{
$data = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8',
]);

$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);

event(new Registered($user));

Mail::to($user->email)->send(new WelcomeMail($user));

return response()->json($user, 201);
}
}


همه‌چیز در یک متد جمع شده؛ اگر جای دیگری هم نیاز به همین منطق باشد، تکرار شروع می‌شود و تست‌نویسی سخت خواهد شد.

این منطق را به یک UserService منتقل می‌کنیم:

namespace App\Services;

use App\Models\User;
use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Illuminate\Auth\Events\Registered;

class UserService
{
public function register(array $data): User
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);

event(new Registered($user));

Mail::to($user->email)->send(new WelcomeMail($user));

return $user;
}
}


حالا Controller فقط نقش هماهنگ‌کننده دارد و بسیار تمیزتر است:

class RegisterController extends Controller
{
public function __construct(private UserService $userService) {}

public function store(RegisterRequest $request)
{
$user = $this->userService->register($request->validated());

return response()->json($user, 201);
}
}


نکات مهم ✅

• Dependency Injection از Service Container لاراول استفاده می‌کند؛ نیازی به new کردن دستی کلاس‌ها نیست.

• با این ساختار، Unit Test برای UserService بدون نیاز به Request یا HTTP بسیار ساده‌تر می‌شود.

• Controllerها فقط ورودی/خروجی HTTP را مدیریت می‌کنند؛ منطق تجاری در Service قرار می‌گیرد و پروژه ساختار تمیزتر و قابل‌گسترش‌تری پیدا می‌کند.

برای مطالعه بیشتر، مستندات رسمی Service Container لاراول:
https://laravel.com/docs/container

قدم‌به‌قدم هر منطق شلوغی را از Controller جدا و به Serviceها منتقل کنید؛ بعد از مدتی، معماری نرم‌افزار قابل‌حفاظت‌تر و توسعه ویژگی‌های جدید لذت‌بخش‌تر می‌شود. 🚀

🔖 #Laravel #PHP #لاراول #Laravel #Service_Layer #Clean_Code #Architecture #PHP

👤 Developix

💎 Channel: @DevelopixLaravel
  • 👍 5
  • 🔥 1
More from @developixlaravel
  1. Oct 1, 2026روابط پایگاه داده چند ریختی یا Eloquent Polymorphic در لاراول - قسمت اول در لاراول، روابط…
  2. Sep 30, 2026مدیریت همزمانی و قفل‌گذاری روی پردازش‌ها در لاراول (Laravel Atomic Locks) در بخش چهارم از…
  3. Sep 26, 2026🔥 پکیج: ورود با حساب‌های دیگر؛ Socialite برای اضافه‌کردن ورود با حساب‌های دیگر به پروژه ل…
  4. Sep 25, 2026🔒 فقط داده‌های تأییدشده را ذخیره کن وقتی یک فرم ویرایش پروفایل داری، ممکن است کلاینت علاو…
  5. Sep 20, 2026حفاظت از پردازش ها با Laravel Rate Limiter بخش سوم - پیکربندی در قسمت سوم از مجموعه آموزش…
  6. Sep 16, 2026🚀 ‏LaraGram Brain منتشر شد! از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraG…
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 →