یکی از شایعترین مشکلات در پروژههای لاراول این است که 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