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-nameveyasort=-school-name(DESC) - Soft delete:
filter[trashed]=with|only
Related
- api-code-conventions — Genel konvansiyonlar
- api-repository-pattern — Repository detayları