About laravel:ports-and-adapters
A Laravel skill for structuring external integrations with ports and adapters. It helps developers keep provider SDK details outside domain code by defining application-focused interfaces and thin adapters.
Key features
- 01Application-focused PHP interfaces
- 02Provider-specific adapter wrappers
- 03Adapter selection through configuration
- 04Normalize SDK data into own types
- 05Thin, tested adapters
Use cases
- 01Isolating an email provider SDK
- 02Switching integrations through configuration
- 03Keeping vendor data out of domain code
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ jpcaparas/ superpowers-laravel --skill laravel:ports-and-adaptersAfter installing, type/laravel:ports-and-adaptersin Claude Code to confirm it loaded.
Details
From the project READMEPorts and Adapters (Hexagonal)
Abstract integrations behind stable interfaces. Keep vendor SDKs out of your domain code.
Shape
- Port: PHP interface that expresses only what the app needs
- Adapters: one per provider, wrapping SDK quirks
- Selection: choose adapter via config/env/service provider
Example (email)
// Port
interface MailPort {
public function send(string $to, string $subject, string $html): void;
}
// Adapter
final class SesMailAdapter implements MailPort {
public function __construct(private \Aws\Ses\SesClient $ses) {}
public function send(string $to, string $subject, string $html): void {
// wrap SES specifics here
}
}
// Composition (AppServiceProvider)
$this->app->singleton(MailPort::class, function () {
return match (config('mail.driver')) {
'ses' => new SesMailAdapter(app('aws.ses')),
default => new SmtpMailAdapter(/* ... */),
};
});
Tips
- Normalize SDK data into your own types/DTOs
- Expose only portable capabilities via the port
- Keep adapters thin and well-tested
Comments
Markdown supported