Installation
composer require apie/core
Ensure your composer.json includes "minimum-stability": "dev" if using unstable versions.
First Use Case: Attribute-Based Annotations Apie/core primarily provides attributes and interfaces for API/endpoint definitions. Start by annotating a class or method:
use Apie\Core\Attributes\ApiEndpoint;
#[ApiEndpoint(path: '/users', methods: ['GET'])]
class UserController {
// ...
}
Where to Look First
src/Attributes/ for available annotations (e.g., ApiEndpoint, ApiRequest, ApiResponse).src/Contracts/ for core interfaces like ApiEndpointInterface or ApiRequestInterface.examples/ for practical usage.#[ApiEndpoint] to define routes/methods. Combine with #[ApiRequest]/#[ApiResponse] for input/output schemas:
#[ApiEndpoint(path: '/users/{id}', methods: ['GET'])]
#[ApiResponse(type: User::class)]
public function show(int $id): User { ... }
#[ApiRequest] to enforce request body/params validation via PHP types or custom validators:
#[ApiRequest(type: CreateUserRequest::class)]
public function store(CreateUserRequest $request) { ... }
AppServiceProvider:
$this->app->bind(
Apie\Core\Contracts\ApiEndpointResolver::class,
Apie\Core\Resolvers\LaravelEndpointResolver::class
);
RouteRegistrar to auto-discover and register endpoints:
$registrar = new Apie\Core\RouteRegistrar();
$registrar->register(app(ApiEndpointResolver::class));
Extend Apie’s functionality by creating custom attributes:
use Apie\Core\Attributes\ApiAttribute;
#[Attribute(Attribute::TARGET_METHOD)]
class RateLimited implements ApiAttribute {
public function __construct(public int $limit) {}
}
Register them via Apie\Core\AttributeRegistry.
Attach Apie-specific middleware (e.g., auth, rate-limiting) to annotated endpoints:
#[ApiEndpoint(middleware: [AuthMiddleware::class])]
public function sensitiveData() { ... }
ApiEndpointResolver to test endpoint resolution:
$resolver = Mockery::mock(ApiEndpointResolver::class);
$resolver->shouldReceive('getEndpoints')->andReturn([...]);
Apie\Core\Testing\Assert for API response assertions:
$this->assertApiResponse(200, User::class, $response);
Attribute Target Mismatches:
#[ApiEndpoint] on classes/methods, not properties).Attribute::TARGET_CLASS_METHOD in custom attributes.Circular Dependencies:
apie/* packages.apie/* packages to the same version in composer.json.Laravel Route Conflicts:
#[ApiEndpoint(priority: -100)] to control order.#[IgnoreRoute].PHP 8.0+ Requirements:
ramsey/uuid.config/apie.php:
'debug' => env('APIE_DEBUG', false),
dd(app(ApiEndpointResolver::class)->getEndpoints());
ReflectionClass::getAttributes() to debug missing/incorrect attributes.Custom Resolvers:
Implement ApiEndpointResolverInterface to override default endpoint resolution logic (e.g., for dynamic routes).
Request/Response Transformers:
Extend Apie\Core\Transformers\JsonTransformer to customize serialization/deserialization.
Event Listeners:
Listen to Apie\Core\Events\EndpointRegistered to react to new endpoints (e.g., for analytics):
Event::listen(EndpointRegistered::class, function ($event) {
Log::info("Registered endpoint: {$event->endpoint->path}");
});
$resolver->setCache(new FileCache(storage_path('framework/cache/apie')));
#[ApiRequest] types (e.g., nested objects) can slow validation. Use DTOs sparingly.'discovery' => false in config/apie.php to manually register endpoints.'attribute_namespaces' to restrict which attributes are processed.
```markdown
### **Community Notes**
- **Monorepo Workflow**:
Contribute via the [apie-lib-monorepo](https://github.com/apie-lib/apie-lib-monorepo). Core issues are tagged `package:core`.
- **Slack/Discord**:
Join the [Apie community](https://apie-lib.github.io/community) for support.
How can I help you explore Laravel packages today?