TGViewer
| AmirHossein | | AmirHossein | @amirhdeveloper · 611 subscribers
Post #283 289
فصل دو - Controllers

بخش دوم - کنترلر های API و Dependency Injection


کنترلر های API:


کنترلرهای API به‌طور خاص برای مدیریت درخواست‌های API استفاده می‌شوند. در اینجا توضیحاتی درباره کنترلرهای API در لاراول ارائه می‌شود:

برای ایجاد یک کنترلر API، می‌توانید از دستور زیر استفاده کنید:
php artisan make:controller Api/UserController --api


این دستور یک کنترلر جدید در مسیر app/Http/Controllers/Api ایجاد می‌کند که شامل متدهای پایه‌ای مانند index, store, show, update و destroy می‌شود.

برای دسترسی به متدهای کنترلر API، باید مسیرهای مناسب را تعریف کنید. در فایل routes/api.php، می‌توانید مسیرها را به صورت زیر تعریف کنید:

برای تعریف این مسیر ها از متد جدیدی از فساد Route استفاده می کنیم:
use App\Http\Controllers\Api\MyController;

Route::apiResource('users', MyController::class);


در صورتی که فایل api.php برای شما در پوشه routes وجود ندارد با دستور زیر آن را ایجاد کنید:
php artisan install:api


تفاوت یک کنترلر API با کنترلر Resource در این است که متد های create و edit در کنترلر API وجود ندارد، زیرا در API ها نیازی به رندر کردن View نیست.

دپندنسی اینجکشن در کنترلر ها:

دپندنسی اینجکشن (Dependency Injection) یکی از اصول مهم طراحی شیءگرا است که به شما کمک می‌کند وابستگی‌های کلاس‌ها را مدیریت کنید و کد قابل تست و قابل نگهداری بنویسید. در لاراول، دپندنسی اینجکشن به سادگی با استفاده از سیستم سرویس کانتینر (Service Container) این فریمورک امکان‌پذیر است.

نکته: درمورد سرویس کانتینر و پروایدر ها در فصل های آینده به طور مفصل توضیح داده می شود.

دپندنسی اینجکشن به این معنا است که یک کلاس به جای اینکه خودش مسئول ایجاد وابستگی‌هایش باشد، این وابستگی‌ها از بیرون به آن تزریق می‌شوند. به عبارت دیگر، وابستگی‌های یک کلاس به عنوان پارامترهای سازنده (constructor) یا متدهای دیگر به آن تحویل داده می‌شوند.

فرض کنید می‌خواهیم یک کنترلر ایجاد کنیم که برای انجام عملیات‌های مربوط به یک مخزن داده (Repository) نیاز به یک سرویس دارد.

ابتدا یک اینترفیس برای مخزن داده تعریف می‌کنیم:
// app/Repositories/UserRepositoryInterface.php
namespace App\Repositories;

interface UserRepositoryInterface {
public function all();
}


سپس یک پیاده‌سازی برای این اینترفیس ایجاد می‌کنیم:
// app/Repositories/UserRepository.php
namespace App\Repositories;

use App\Models\User;

class UserRepository implements UserRepositoryInterface {
public function all() {
return User::all();
}
}


باید پیاده‌سازی مخزن را در سرویس کانتینر لاراول ثبت کنیم تا بتوانیم آن را به کنترلر تزریق کنیم. برای این کار، از یک سرویس پروایدر استفاده می‌کنیم.

می توانید با دستور زیر یک پروایدر ایجاد کنید:
php artisan make:provider RepositoryServiceProvider 


و درون آن:
// app/Providers/RepositoryServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Repositories\UserRepositoryInterface;
use App\Repositories\UserRepository;

class RepositoryServiceProvider extends ServiceProvider {
public function register() {
$this->app->bind(UserRepositoryInterface::class, UserRepository::class);
}
}



سپس این سرویس پروایدر را به لیست پروایدرهای اپلیکیشن اضافه می‌کنیم:

// bootstrap/providers.php
return [
App\Providers\AppServiceProvider::class,
App\Providers\RepositoryServiceProvider::class,
];



حالا می‌توانیم این مخزن را به کنترلر تزریق کنیم:
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use App\Repositories\UserRepositoryInterface;

class UserController extends Controller {
protected $userRepository;

public function __construct(UserRepositoryInterface $userRepository) {
$this->userRepository = $userRepository;
}

public function index() {
$users = $this->userRepository->all();
return view('users.index', compact('users'));
}
}



در این مثال، کلاس UserController وابستگی خود را به UserRepositoryInterface از طریق کانستراکتور دریافت می‌کند. لاراول به صورت خودکار پیاده‌سازی صحیح را از طریق سرویس کانتینر تزریق می‌کند.

#laravel #فصل_۲
@AmirhDeveloper
.
  • ❤ 1
  • 🔥 1
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 →