Proje: Okul Platform · Hub: Okul Platform — Conventions

Katman Yapısı

HTTP Request
    ↓
FormRequest (validation)
    ↓
Controller (ince - sadece yönlendirme)
    ↓
Service (iş mantığı)
    ↓
Repository (veri erişimi)
    ↓
Model (Eloquent)

Controller Konvansiyonları

Policy kullanımı:

$this->authorizeResource(School::class, 'school');

→ Policy otomatik bağlanır (CRUD metodlarına göre).

Constructor DI: final readonly class service’ler constructor’da inject edilir.

Response: Her zaman JsonResponse::success(data: $resource) kullanılır.

Swagger: Controller’larda #[OA\Get/Post/Put/Delete(...)] attribute’ları.

Service Sınıfları

İki farklı service namespace’i dikkat!

app/Services/Controllers/Admin/School/SchoolService  
    ↑ HTTP request ile doğrudan çalışan servis (DTO alır)

app/Services/Admin/School/SchoolService
    ↑ Bağımsız servis (model/DTO ile çalışır)

Not: Services/Controllers/ altındakiler controller’a özel, request-context bağımlı. Services/Admin/ altındakiler ise pure business logic.

Repository Yapısı

Interfaces/SchoolRepositoryInterface → Repos/School/SchoolRepository

RepositoryServiceProvider’da DI binding yapılır:

$this->app->bind(SchoolRepositoryInterface::class, SchoolRepository::class);

Repository base: BaseRepository sınıfından extend edilir. QueryCondition helper class’ı ile filtre uygulanır.

DTO Adlandırma Kuralı

Admin/School/IndexSchoolDTO     → Admin'e özel listeleme DTO
Repository/School/CreateSchoolDTO → Repo'ya özel oluşturma DTO

NotProvided special type — “gönderilmedi” ile “null gönderildi” arasındaki fark için.

Spatie QueryBuilder

Admin listelemelerde sıklıkla kullanılır:

  • Filtreler: filter[school-name], filter[customer-id]
  • Sıralama: sort=school-name veya sort=-school-name (DESC)
  • Soft delete: filter[trashed]=with|only