You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
5.1 KiB
Markdown

# AGENTS.md - Hyperf Skeleton Development Guide
This document provides guidelines for agentic coding agents working in this Hyperf framework project.
## Project Overview
- **Framework**: Hyperf ~3.1.0 (PHP coroutine framework)
- **PHP Version**: >= 8.1
- **Runtime**: Swoole
- **License**: Apache-2.0
---
## Build/Lint/Test Commands
### Run All Tests
```bash
composer test
# or
co-phpunit --prepend test/bootstrap.php --colors=always
```
### Run Single Test
```bash
# By test method name
vendor/bin/phpunit --filter testExample
# By fully qualified class name
vendor/bin/phpunit --filter 'HyperfTest\\Cases\\ExampleTest::testExample'
# By test class
vendor/bin/phpunit test/Cases/ExampleTest.php
```
### Code Style Fix
```bash
# Fix all files
composer cs-fix
# Fix specific file
php-cs-fixer fix app/Controller/IndexController.php
# Dry run (check only)
php-cs-fixer fix --dry-run --diff
# Fix with config explicitly
php-cs-fixer fix --config=.php-cs-fixer.php
```
### Static Analysis (PHPStan)
```bash
composer analyse
# or
vendor/bin/phpstan analyse --memory-limit 300M
# With specific level
vendor/bin/phpstan analyse --memory-limit 200M -l 5
```
### Start Development Server
```bash
composer start
# or
php ./bin/hyperf.php start
```
---
## Code Style Guidelines
### File Structure
### PSR Standards
- **PSR-2**: Code must follow PSR-2 coding style
- **PSR-4**: Autoloading via namespaces
### PHP CS Fixer Rules (from `.php-cs-fixer.php`)
| Rule | Value |
|------|-------|
| Array syntax | Short: `[]` instead of `array()` |
| List syntax | Short: `list($a, $b)``[$a, $b]` |
| Concat space | One space around `.` |
| Quote style | Single quotes |
| Declare strict types | Required: `declare(strict_types=1);` |
| Ordered imports | class → function → const |
| Global namespace import | `use App\Foo;` (no leading `\`) |
| Yoda style | Variable on right: `$value === self::FOO` |
| Blank line before statement | Before `declare` |
| Not operator | With successor space: `! $value` |
| Constant case | Lower: `const FOO = 1;` |
### Imports Ordering
```php
use App\Constants\ErrorCode;
use Hyperf\Constants\AbstractConstants;
use Hyperf\Constants\Annotation\Constants;
use Hyperf\HttpServer\Contract\RequestInterface;
use Psr\Container\ContainerInterface;
#[Constants]
class ErrorCode extends AbstractConstants
{
// ...
}
```
### Naming Conventions
| Element | Convention | Example |
|---------|------------|---------|
| Namespace | PascalCase | `App\Controller`, `App\Constants` |
| Class | PascalCase | `IndexController`, `BusinessException` |
| Method | camelCase | `getUser()`, `handleMessage()` |
| Property | camelCase | `$request`, `$container` |
| Constant | SCREAMING_SNAKE | `SERVER_ERROR`, `DEFAULT_TIMEOUT` |
| File | PascalCase.php | `ErrorCode.php`, `IndexController.php` |
### Type Declarations
- Use strict types: `declare(strict_types=1);`
- Use return type hints when possible
- Use property type hints
```php
class QueueHandleListener implements ListenerInterface
{
protected LoggerInterface $logger;
public function __construct(ContainerInterface $container)
{
// ...
}
public function process(object $event): void
{
// ...
}
}
```
### PHPDoc Annotations
- Align PHPDoc annotations to the left
- Do NOT use `@author` annotation
- Use `@param` and `@return` with types
```php
/**
* @param int $code Error code
* @param string|null $message Error message
*/
public function __construct(int $code = 0, string $message = null)
```
### Dependency Injection
Use `#[Inject]` attribute for automatic injection:
```php
use Hyperf\Di\Annotation\Inject;
class AbstractController
{
#[Inject]
protected ContainerInterface $container;
#[Inject]
protected RequestInterface $request;
}
```
### Error Handling
- Business exceptions: `App\Exception\BusinessException`
- Extends `Hyperf\Server\Exception\ServerException`
- Use Hyperf's `LoggerInterface` for logging
- Use `ErrorCode::getMessage($code)` to get error messages
### Directory Structure
```
app/
├── Constants/ # ErrorCode, system constants
├── Controller/ # HTTP controllers
├── Exception/ # Exception classes and handlers
├── Listener/ # Event listeners
├── Model/ # Database models
└── Process/ # Custom processes
test/
├── bootstrap.php # Test bootstrap
├── Cases/ # Test cases
└── HttpTestCase.php # HTTP test base class
config/
├── container.php # DI container config
└── ...
```
### Testing
- Tests extend `Hyperf\Testing\TestCase` or `HyperfTest\HttpTestCase`
- Test classes in `HyperfTest\*` namespace
- Use `#[CoversNothing]` for unit tests without coverage
- Use `$this->get()`, `$this->post()`, etc. for HTTP assertions
### Gitignore Patterns
```
vendor/
runtime/
.env
.phpunit.cache/
```
---
## CI/CD
The project uses GitHub Actions (see `.github/workflows/build.yml`). Docker build is triggered on push and pull requests.
## Additional Resources
- [Hyperf Wiki](https://hyperf.wiki)
- [Hyperf Documentation](https://hyperf.wiki)
- [PSR-2 Coding Style Guide](https://www.php-fig.org/psr/psr-2/)