Portlar ve Adaptörler Açıklaması
Portlar ve takılıp çıkarılabilir adaptörlerle çekirdeği yalıtın.
Portlar ve Adaptörler Açıklaması, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Altıgen Fikri
Bağlantı Noktaları ve Uyarlayıcılar — Alistair Cockburn'ün Altıgen Mimarisi — uygulamanızı bir altıgen olarak çizer. İçeride saf iş mantığı bulunur. Dış dünyayla her etkileşim (HTTP, veritabanı, kuyruk, saat, e-posta) bir bağlantı noktasından geçer ve her bağlantı noktası bir veya daha fazla uyarlayıcı tarafından karşılanır. Biçimin ayrıcalıklı bir üstü veya altı yoktur: kullanıcı arayüzü ve veritabanı simetriktir; ikisi de yalnızca uyarlayıcıdır.
Bağlantı Noktaları Arayüzdür
Bir bağlantı noktası, uygulama çekirdeğinin sahip olduğu ve bir ihtiyacı veya capability'yi alan terimleriyle ifade eden arayüzdür. Altyapı söz varlığını içeri sızdırmamalıdır — PDOStatement yok, GuzzleResponse yok, Eloquent yok.
<?php
// Driven (outbound) port: the core needs to persist users
interface UserRepository
{
public function byId(UserId $id): ?User;
public function save(User $user): void;
}Çağıran ve Çağrılan Bağlantı Noktaları
İki tür vardır:
- Çağıran (birincil, gelen) bağlantı noktaları — dış dünyanın uygulamayı yönlendirmek için çağırdığı API. Genellikle kullanım senaryosu arayüzlerinizdir.
- Çağrılan (ikincil, giden) bağlantı noktaları — uygulamanın dünyaya ulaşmak için çağırdığı arayüzler: depolar, e-posta göndericileri, saatler.
Çağıran uyarlayıcılar çekirdeği çağırır; çekirdek, çağrılan uyarlayıcılar üzerinden dışarıya çağrı yapar.
<?php
// Driving (inbound) port — the public capability of the core
interface RegisterUser
{
public function handle(string $email, string $plainPassword): UserId;
}Çekirdek Çağıran Bağlantı Noktalarını Uygular
Kullanım senaryosu bir çağıran bağlantı noktasını uygular ve çağrılan bağlantı noktalarına bağlıdır. Dikkat: Enjekte edilen bağlantı noktaları olarak PasswordHasher ve Clock kabul eder — çekirdeğin belirlenebilir ve sınanabilir kalması için zaman ve parola özetleme bile soyutlanmıştır.
<?php
final class RegisterUserService implements RegisterUser
{
public function __construct(
private UserRepository $users,
private PasswordHasher $hasher,
private Clock $clock,
) {}
public function handle(string $email, string $plain): UserId {
if ($this->users->byEmail($email)) {
throw new EmailAlreadyTaken($email);
}
$user = User::register(
$email,
$this->hasher->hash($plain),
$this->clock->now()
);
$this->users->save($user);
return $user->id();
}
}Çağrılan Bir Uyarlayıcı
Bir çağrılan uyarlayıcı, somut bir teknoloji kullanarak çağrılan bir bağlantı noktasını uygular. Burada bir PDO uyarlayıcısı UserRepository gereksinimini karşılar. Çekirdeğe dokunmadan bunu Doctrine, Redis veya bir HTTP API istemcisiyle değiştirebilirsiniz.
<?php
final class PdoUserRepository implements UserRepository
{
public function __construct(private PDO $pdo) {}
public function byId(UserId $id): ?User {
$stmt = $this->pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([(string) $id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row ? User::fromRow($row) : null;
}
public function save(User $user): void {
// INSERT ... ON CONFLICT UPDATE
}
}Çağıran Bir Uyarlayıcı
Bir çağıran uyarlayıcı, harici bir tetikleyiciyi çağıran bir bağlantı noktasındaki çağrıya çevirir. Bir HTTP denetleyicisi, bir CLI komutu veya bir ileti tüketicisi — hepsi aynı kullanım senaryosu için birbirinin yerine kullanılabilir çağıran uyarlayıcılardır.
<?php
// CLI driving adapter
final class RegisterUserCommand
{
public function __construct(private RegisterUser $register) {}
public function run(array $argv): int {
[$email, $password] = array_slice($argv, 1);
$id = $this->register->handle($email, $password);
fwrite(STDOUT, "Created user $id\n");
return 0;
}
}Sınamalar için Bellek İçi Uyarlayıcılar
En büyük kazanç şudur: her çağrılan bağlantı noktası hızlı bir sahte uygulama alır. Sınamalar, gerçek kullanım senaryosunu bellek içi uyarlayıcılar, belirlenebilir saatler ve işlem yapmayan bir parola özetleyiciyle çalıştırır.
<?php
final class FixedClock implements Clock {
public function __construct(private DateTimeImmutable $t) {}
public function now(): DateTimeImmutable { return $this->t; }
}
final class PlainHasher implements PasswordHasher {
public function hash(string $p): string { return 'h:' . $p; }
}
$service = new RegisterUserService(
new InMemoryUsers(),
new PlainHasher(),
new FixedClock(new DateTimeImmutable('2026-01-01'))
);
echo 'wired OK', PHP_EOL;Adaptörler Çevirir, Karar Vermez
Yaygın bir hata, iş kurallarının adaptörlere sızmasına izin vermektir. Pratik kural şudur: bir adaptör yalnızca veri biçimlerini ve protokolleri çevirir. Bir denetleyicinin veya deponun içinde fiyatlandırma, uygunluk ya da durum hakkında bir if bulursanız, bu kod çekirdeğe aittir.
- JSON ↔ DTO eşlemesi: adaptör
- SQL ↔ varlık doldurma: adaptör
- "VIP %10 indirim alır": çekirdek
Bir Bağlantı Noktası, Çok Sayıda Adaptör
Bağlantı noktaları, değiştirmeyi ve hatta paralel adaptörleri mümkün kılar. Bir NotificationPort, birlikte oluşturulan e-posta, SMS ve Slack adaptörlerine sahip olabilir. Çekirdek tek bir yöntemi çağırır; bağlantılandırma kaç kanalın yanıt vereceğine karar verir.
<?php
interface Notifier { public function send(string $to, string $msg): void; }
final class CompositeNotifier implements Notifier {
/** @param Notifier[] $channels */
public function __construct(private array $channels) {}
public function send(string $to, string $msg): void {
foreach ($this->channels as $c) $c->send($to, $msg);
}
}
$notifier = new CompositeNotifier([new EmailNotifier(), new SmsNotifier()]);
echo 'composed', PHP_EOL;Altıgen Klasörlere Nasıl Eşlenir
Sınırlı bir bağlam için pragmatik PHP yerleşimi:
Domain/— varlıklar, değer nesneleri, alan hizmetleriApplication/Port/In/— giriş bağlantı noktası arayüzleri (kullanım senaryoları)Application/Port/Out/— çıkış bağlantı noktası arayüzleri (depolar, saat)Application/— kullanım senaryosu uygulamalarıInfrastructure/Adapter/In/— denetleyiciler, CLI, tüketicilerInfrastructure/Adapter/Out/— PDO/Doctrine/HTTP adaptörleri
Birleştirme kökü (DI konteyneri yapılandırması), In ve Out adaptörlerini bağlantı noktalarına bağlar.
Bütün Altıgeni Sınama
Birim sınamalarının ötesinde, bağlantı noktaları, uygulamayı birincil bağlantı noktası üzerinden çalıştıran ve bellek içi ikincil adaptörler aracılığıyla doğrulayan hızlı kabul sınamalarını mümkün kılar — HTTP veya veritabanı olmadan tam bir kullanım senaryosunu kapsar. Aynı sınama paketi daha sonra gerçek adaptörlere karşı tümleştirme sınamaları olarak çalıştırılır; böylece yeniden yazım gerektirmeyen katmanlı bir sınama stratejiniz olur.
<?php
// Acceptance test: real use case, fake driven adapters, no I/O
$users = new InMemoryUsers();
$service = new RegisterUserService($users, new PlainHasher(),
new FixedClock(new DateTimeImmutable('2026-01-01')));
$id = $service->handle('dev@coddykit.com', 'pw');
assert($users->byId($id) !== null);
echo 'acceptance: user persisted via in-memory adapter', PHP_EOL;Hızlı Kontrol
Bağlantı noktaları ve adaptörler hakkında hangi ifade doğrudur?
Özet
Bağlantı Noktaları ve Adaptörler, çekirdeği arayüzlerin arkasında yalıtır:
- Bağlantı noktaları, çekirdeğin sahip olduğu ve alan diliyle ifade edilen arayüzlerdir.
- Giriş bağlantı noktaları gelen adaptörler tarafından çağrılır; çıkış bağlantı noktaları çekirdek tarafından çağrılır ve giden adaptörler tarafından karşılanır.
- Adaptörler yalnızca protokolleri ve biçimleri çevirir — hiçbir zaman iş kararı vermez.
- Aynı bağlantı noktası, çok sayıda adaptörü destekler (sınamalar için sahteler, birden çok hedefe dağıtım için bileşikler).
- Birleştirme kökü her şeyi bağlar; altıgen çerçeveden bağımsız kalır.
Sıkça Sorulan Sorular
“Portlar ve Adaptörler Açıklaması” dersi ücretsiz mi?
Evet — “Portlar ve Adaptörler Açıklaması” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Portlar ve Adaptörler Açıklaması” dersinde ne öğreneceğim?
Portlar ve takılıp çıkarılabilir adaptörlerle çekirdeği yalıtın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Portlar ve Adaptörler Açıklaması” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Katmanlı Mimariden Temiz Mimariye
- Portlar ve Adaptörler Açıklaması
- Kullanım Durumları ve Uygulama Hizmetleri
- Bağımlılığın Tersine Çevrilmesi Uygulamada