Service Layer

SkillDev tools

Guides your agent to write code with a clean service layer, placing business logic in framework-agnostic service classes.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Service Layer skill

About this capability

Defines application service structure and business orchestration boundaries

What this skill tells your AI

The instructions your AI receives, as published by bottelet/daybydaycrm in .claude/skills/service-layer/SKILL.md and read by ahel’s review.

Services are the only place business logic lives. They are framework-agnostic.


1. Responsibility

Services MUST:

  • contain business logic
  • coordinate models
  • enforce domain rules
  • return models or DTOs

Services MUST NOT:

  • accept or return HTTP request/response objects
  • contain UI logic
  • use app() or resolve() internally

2. Dependency Rule

Constructor injection only:

public function __construct(
    private InvoiceRepository $repository
) {}

3. DTO Rule

DTOs are not required when the source is a validated FormRequest::validated() array. Arrays are fine there.

Use DTOs when:

  • crossing system boundaries (API, queues, external integrations)
  • multiple services share a contract
  • the payload must be stable across refactors

Skip DTOs when:

  • input comes from a single controller action's validated request
  • the data is short-lived and not reused

4. Standard Shape

app/Services/{Domain}/{Model}Service.php

e.g. app/Services/Task/TaskService.php, app/Services/Offer/OfferService.php.

Standard method names: create, update, delete, findByExternalId. Prefer one service class per domain holding both create/update (see TaskService) over splitting into separate per-action service classes.

Signals

GitHub stars
2k
Forks
767
Last commit
Aug 2026
Advanced
Catalog kind
skill
Gateway key
service-layer
Source
github.com/bottelet/daybydaycrm