دیزاین پترن
Repository یکی از الگوهای معماری مورد استفاده در توسعه نرمافزار است که به عنوان واسطی بین بخشهای دادهی دائمی (مثل دیتابیس) و بخشهای کد برنامه مورد استفاده قرار میگیرد. هدف اصلی این دیزاین پترن، جداسازی لایههای داده از لایههای برنامهنویسی و ایجاد یک واسط یکسان برای دسترسی و مدیریت دادهها می باشد.فرض کنید که شما در حال توسعه یک برنامهی وب برای مدیریت اطلاعات کاربران هستید. اطلاعات کاربران (مانند نام، ایمیل، رمزعبور و ...) در یک پایگاه دادهی رابطهای (مثل
MySQL) ذخیره میشود. به جای اینکه در کد برنامهی خود مستقیماً با پایگاه داده ارتباط برقرار کنید، از دیزاین پترن Repository استفاده میکنیم.مثال :
ابتدا یک
Interface برای Repository تعریف میکنیم که متدهایی برای ایجاد (create)، خواندن (read)، بروزرسانی (update) و حذف (delete) اطلاعات کاربران داشته باشد.interface UserRepositoryInterface {
public function create(array $data): bool;
public function read(int $id): array;
public function update(int $id, array $data): bool;
public function delete(int $id): bool;
}
حالا یک کلاس برای Repository برای دیتابیس MySQL ایجاد میکنیم و متدهای Interface را پیادهسازی میکنیم.class MySQLUserRepository implements UserRepositoryInterface {
private $connection;
public function __construct(mysqli $connection) {
$this->connection = $connection;
}
public function create(array $data): bool {
// Code to create user
return true;
}
public function read(int $id): array {
// Code to select user by id
$data = ['userDataFromDb'];
return $data;
}
public function update(int $id, array $data): bool {
// Code to update user
return true;
}
public function delete(int $id): bool {
// Code to delete user
return true;
}
}
حالا میتوانیم در برنامهی خود از Repository استفاده کنیم.// create connection and repository
$connection = new mysqli("localhost", "username", "password", "database_name");
$userRepository = new MySQLUserRepository($connection);
// create new user
$newUser = [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'hashed_password'
];
$userRepository->create($newUser);
// select user by id
$userData = $userRepository->read(1);
print_r($userData);
// update user by id
$updatedUser = [
'name' => 'Jane Doe',
'email' => 'jane@example.com',
'password' => 'new_hashed_password'
];
$userRepository->update(1, $updatedUser);
// delete user
$userRepository->delete(1);
در این مثال، با استفاده از اینترفیس UserRepositoryInterface، وابستگیهای کد به پایگاه داده جدا میشود. سپس با پیادهسازی کلاس MySQLUserRepository، کار با پایگاه دادهی MySQL به صورت مستقیم در Repository انجام میشود. این جداسازی باعث میشود تا میتوانیم با تغییر پایگاه داده، کد برنامهی خود را به راحتی تغییر داده و با اطمینان از عملکرد درست نرمافزار خود مطمئن شویم. همچنین، این کار باعث میشود که مدیریت دادهها و دسترسی به آنها به صورت مجزا و قابل مدیریتتری صورت گیرد..