لایه ریپوزیتوری و فایلهای معیار
در این سند
مقدمه
در توسعه Laravel، لایه ریپوزیتوری و فایلهای معیار به عنوان ترکیبی قدرتمند برای مدیریت بازیابی و دستکاری دادهها عمل میکنند. پکیج andersao/l5-repository معمولاً برای پیادهسازی لایه ریپوزیتوری استفاده میشود و روشی مناسب برای جداسازی عملیات پایگاه داده از بقیه برنامه فراهم میکند.
استفاده از ریپوزیتوریها به حفظ جداسازی تمیز بین منطق کسبوکار و لایه دسترسی به داده کمک میکند، که کد شما را قابل نگهداریتر و قابل آزمایشتر میسازد.
چرا ریپوزیتوریها؟
ریپوزیتوریها به انتزاع لایه دسترسی به داده کمک میکنند و امکان سازماندهی و نگهداری بهتر کد را فراهم میکنند. پکیج andersao/l5-repository با گسترش ORM Eloquent لاراول، مجموعهای از ابزارها را برای ایجاد، خواندن، بهروزرسانی و حذف رکوردها به روشی سازگار ارائه میدهد.
نصب andersao/l5-repository
برای شروع کار با andersao/l5-repository، باید پکیج را با استفاده از Composer نصب کنید:
composer require andersao/l5-repository
پس از نصب، میتوانید ریپوزیتوریها را برای مدلهای خود راهاندازی کنید.
راهنمای پیادهسازی
- ایجاد ریپوزیتوریها
- استفاده از ریپوزیتوریها
- فایلهای معیار
- اعمال معیارها
ایجاد ریپوزیتوریها
ریپوزیتوریها کلاسهایی هستند که منطق تعامل با پایگاه داده را کپسوله میکنند. آنها یک API تمیز و سازگار برای دسترسی به داده فراهم میکنند.
گام 1: ایجاد رابط ریپوزیتوری
<?php
namespace App\Repositories;
use Prettus\Repository\Contracts\RepositoryInterface;
interface UserRepository extends RepositoryInterface
{
// میتوانید متدهای سفارشی اینجا اضافه کنید
}
گام 2: ایجاد پیادهسازی ریپوزیتوری
<?php
namespace App\Repositories;
use Prettus\Repository\Eloquent\BaseRepository;
use Prettus\Repository\Criteria\RequestCriteria;
use App\Models\User;
class UserRepositoryEloquent extends BaseRepository implements UserRepository
{
public function model()
{
return User::class;
}
public function boot()
{
$this->pushCriteria(app(RequestCriteria::class));
}
}
گام 3: ثبت در AppServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(
\App\Repositories\UserRepository::class,
\App\Repositories\UserRepositoryEloquent::class
);
}
}
استفاده از ریپوزیتوریها در سرویسها یا کنترلرها
پس از ایجاد ریپوزیتوریها، میتوانید از آنها در سرویسها یا کنترلرها برای انجام عملیات پایگاه داده استفاده کنید.
در یک کلاس سرویس
<?php
namespace App\Services;
use App\Repositories\UserRepository;
class UserService
{
protected $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function getUserById($id)
{
return $this->userRepository->find($id);
}
public function getAllUsers()
{
return $this->userRepository->all();
}
public function createUser(array $data)
{
return $this->userRepository->create($data);
}
}
در یک کنترلر
<?php
namespace App\Http\Controllers;
use App\Repositories\UserRepository;
use Illuminate\Http\Request;
class UserController extends Controller
{
protected $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function index()
{
return response()->json([
'data' => $this->userRepository->all()
]);
}
public function show($id)
{
return response()->json([
'data' => $this->userRepository->find($id)
]);
}
}
فایلهای معیار
فایلهای معیار کلاسهایی هستند که شرایط یا فیلترهای خاصی را برای اعمال به پرسوجوهای پایگاه داده تعریف میکنند. آنها امکان ساخت پرسوجوی پویا و قابل استفاده مجدد را فراهم میکنند.
ایجاد یک کلاس معیار
<?php
namespace App\Criteria;
use Prettus\Repository\Contracts\RepositoryInterface;
use Prettus\Repository\Contracts\CriteriaInterface;
class ActiveUsersCriteria implements CriteriaInterface
{
public function apply($model, RepositoryInterface $repository)
{
return $model->where('status', 'active');
}
}
ایجاد یک معیار با پارامترها
<?php
namespace App\Criteria;
use Prettus\Repository\Contracts\RepositoryInterface;
use Prettus\Repository\Contracts\CriteriaInterface;
class UsersByTypeCriteria implements CriteriaInterface
{
protected $type;
public function __construct($type)
{
$this->type = $type;
}
public function apply($model, RepositoryInterface $repository)
{
return $model->where('type', $this->type);
}
}
اعمال معیارها به ریپوزیتوریها
میتوانید معیارها را به ریپوزیتوریها اعمال کنید تا نتایج پرسوجو را فیلتر یا اصلاح کنید.
در یک کنترلر
<?php
namespace App\Http\Controllers;
use App\Repositories\UserRepository;
use App\Criteria\ActiveUsersCriteria;
use App\Criteria\UsersByTypeCriteria;
class UserController extends Controller
{
protected $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function getActiveUsers()
{
$this->userRepository->pushCriteria(new ActiveUsersCriteria());
return response()->json([
'data' => $this->userRepository->all()
]);
}
public function getAdminUsers()
{
$this->userRepository->pushCriteria(new UsersByTypeCriteria('admin'));
return response()->json([
'data' => $this->userRepository->all()
]);
}
public function getActiveAdmins()
{
$this->userRepository
->pushCriteria(new ActiveUsersCriteria())
->pushCriteria(new UsersByTypeCriteria('admin'));
return response()->json([
'data' => $this->userRepository->all()
]);
}
}
نادیده گرفتن موقت معیارها
// نادیده گرفتن تمام معیارها
$users = $this->userRepository->skipCriteria()->all();
// نادیده گرفتن معیارهای خاص
$users = $this->userRepository->skipCriteria(ActiveUsersCriteria::class)->all();
متدهای رایج ریپوزیتوری
پکیج andersao/l5-repository چندین متد داخلی برای عملیات رایج ارائه میدهد:
| متد | توضیحات | مثال |
|---|---|---|
all() | دریافت تمام رکوردها | $repository->all() |
find($id) | یافتن با ID | $repository->find(1) |
findByField($field, $value) | یافتن با فیلد | $repository->findByField('email', 'user@example.com') |
findWhere(array $where) | یافتن با شرایط | $repository->findWhere(['status' => 'active', 'type' => 'admin']) |
create(array $attributes) | ایجاد رکورد جدید | $repository->create(['name' => 'John', 'email' => 'john@example.com']) |
update(array $attributes, $id) | بهروزرسانی رکورد | $repository->update(['status' => 'inactive'], 1) |
delete($id) | حذف رکورد | $repository->delete(1) |
orderBy($column, $direction) | مرتبسازی نتایج | $repository->orderBy('created_at', 'desc')->all() |
with($relations) | بارگذاری روابط | $repository->with(['posts', 'comments'])->find(1) |
paginate($limit) | صفحهبندی نتایج | $repository->paginate(15) |
ویژگیهای پیشرفته
کش کردن نتایج
این پکیج از کش کردن نتایج ریپوزیتوری برای بهبود عملکرد پشتیبانی میکند:
// در کلاس ریپوزیتوری شما
public function boot()
{
$this->pushCriteria(app(RequestCriteria::class));
$this->setCacheLifetime(60); // کش برای 60 دقیقه
}
هنگامی که دادههای شما به طور مکرر تغییر میکنند، با کش کردن مراقب باشید. ممکن است نیاز به پیادهسازی استراتژیهای نامعتبرسازی کش داشته باشید.
لایه ارائهدهنده
میتوانید از ارائهدهندهها برای قالببندی دادههای خود قبل از برگرداندن استفاده کنید:
<?php
namespace App\Presenters;
use App\Transformers\UserTransformer;
use Prettus\Repository\Presenter\FractalPresenter;
class UserPresenter extends FractalPresenter
{
public function getTransformer()
{
return new UserTransformer();
}
}
// در ریپوزیتوری شما
public function presenter()
{
return UserPresenter::class;
}
نتیجهگیری
پیادهسازی لایه ریپوزیتوری با andersao/l5-repository و فایلهای معیار در Laravel، جداسازی تمیز دغدغهها را در برنامه شما ترویج میکند. ریپوزیتوریها عملیات پایگاه داده را انتزاعی میکنند، در حالی که فایلهای معیار روشی انعطافپذیر برای فیلتر کردن یا اصلاح پویای نتایج پرسوجو ارائه میدهند.
قابلیتهای andersao/l5-repository را برای مدیریت سناریوهای پیچیدهتر، مانند کش کردن، صفحهبندی و بارگذاری روابط، برای بازیابی کارآمد داده در پروژههای Laravel خود بررسی کنید.