Bir önceki yazımda, Laravel’in iç yapısında yoğun biçimde kullanılan bazı temel tasarım kalıplarının ne olduğunu ve framework içindeki karşılıklarını anlatmıştım: Singleton, Factory, Strategy gibi desenlerin Laravel’de nasıl hayat bulduğunu birlikte inceledik.
Ancak yazının sonunda da belirttiğim gibi, bu kalıpların gerçekten özümsenmesi için yalnızca Laravel’e güvenmek yeterli değil. Laravel çoğu şeyi bizim yerimize hallederken, tasarım kalıplarını ezbere değil bilinçli şekilde kullanabilmek için temellerine inmek şart.
Observer, Template Method, Dependency Injection, Repository, Data Mapper ve Facade kalıplarını Laravel’den bağımsız olarak, saf PHP ile adım adım örnekleyerek inceliyoruz.
1. Observer Pattern – Olayları İzleyen Yapı
Amaç: Bir olay gerçekleştiğinde bağlı tüm nesneleri haberdar et.
Senaryo: Kullanıcı kaydolduğunda birden fazla işlem (e-posta gönderimi, loglama, bildirim) yapılması gerekiyor.
interface Observer {
public function update(string $eventData);
}
class SendWelcomeEmail implements Observer {
public function update(string $eventData) {
echo "Hoş geldin e-postası gönderildi: $eventData\n";
}
}
class LogUserRegistration implements Observer {
public function update(string $eventData) {
echo "Kayıt loglandı: $eventData\n";
}
}
class User {
private array $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function register(string $name) {
echo "Kullanıcı kaydedildi: $name\n";
$this->notify($name);
}
private function notify(string $data) {
foreach ($this->observers as $observer) {
$observer->update($data);
}
}
}
Kullanım:
$user = new User();
$user->attach(new SendWelcomeEmail());
$user->attach(new LogUserRegistration());
$user->register(“Mehmet”);
2. Template Method Pattern – Adımları Belirle, Detayları Alt Sınıflara Bırak
Amaç: Ana algoritmayı soyut sınıfta tanımla, alt sınıflar küçük detayları değiştirsin.
abstract class ReportGenerator {
public function generate() {
$this->header();
$this->content();
$this->footer();
}
abstract protected function header();
abstract protected function content();
abstract protected function footer();
}
class SalesReport extends ReportGenerator {
protected function header() {
echo "SATIŞ RAPORU\n";
}
protected function content() {
echo "İçerik: Satış verileri...\n";
}
protected function footer() {
echo "Tarih: " . date('Y-m-d') . "\n";
}
}
Kullanım:
$report = new SalesReport();
$report->generate();
3. Dependency Injection (DI) – Bağımlılıkları dışarıdan ver
Amaç: Nesneler kendi bağımlılıklarını üretmek yerine dışarıdan alır. Test ve değiştirilebilirlik kolaylaşır.
class Mailer {
public function send($message) {
echo "Mail gönderildi: $message\n";
}
}
class UserController {
public function __construct(private Mailer $mailer) {}
public function register() {
// kullanıcı kaydı
$this->mailer->send("Hoş geldiniz!");
}
}
Kullanım:
$mailer = new Mailer();
$controller = new UserController($mailer);
$controller->register();
4. Repository Pattern – Veritabanı Erişimini Soyutla
Amaç: Veritabanına erişim katmanını soyutlayarak business logic’ten ayırmak.
class UserRepository {
public function find($id): array {
// normalde burada PDO sorgusu olurdu
return ['id' => $id, 'name' => 'Ahmet'];
}
}
Kullanım:
$repo = new UserRepository();
$user = $repo->find(1);
echo $user['name'];
5. Data Mapper – Nesneleri Veritabanı ile Bağımsız Hale Getir
Amaç: Entity sınıfları veritabanına dair hiçbir şey bilmez.
class User {
public function __construct(public string $name, public int $age) {}
}
class UserMapper {
public function insert(User $user) {
echo "INSERT INTO users (name, age) VALUES ('$user->name', $user->age)";
}
}
Kullanım:
$user = new User("Can", 30);
$mapper = new UserMapper();
$mapper->insert($user);
6. Facade Pattern – Karmaşık Sistemi Basit Arayüzle Sun
Amaç: Karmaşık alt sistemleri tek bir basit arabirimle sunmak.
class AuthService {
public function login($email, $password) {
echo "Giriş yapıldı: $email\n";
}
}
class Logger {
public function log($message) {
echo "Log: $message\n";
}
}
class AuthFacade {
public function __construct(
private AuthService $authService,
private Logger $logger
) {}
public function login($email, $password) {
$this->authService->login($email, $password);
$this->logger->log("Kullanıcı giriş yaptı: $email");
}
}
Kullanım:
phpCopyEdit$facade = new AuthFacade(new AuthService(), new Logger());
$facade->login("ali@example.com", "123456");
Eğer bu yazıyı faydalı bulduysan, Takipte kal, hatta e-posta ile abone olmayı unutma 😉
Yorumlarını ve sorularını aşağıya bırakmayı unutma — birlikte öğreniyoruz!


İlk Yorumu Siz Yapın