بخش دوم - کنترلر های 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
.