AgentSkillsCN

acc-psr-overview-knowledge

为 PHP 8.5 项目提供 PSR(PHP 标准推荐)概览知识库。全面收录所有已接受的 PSR,包括 PSR-1、3、4、6、7、11、12、13、14、15、16、17、18、20。适用于 PSR 选型决策与合规性审计。

SKILL.md
--- frontmatter
name: acc-psr-overview-knowledge
description: PHP Standards Recommendations (PSR) overview knowledge base. Provides comprehensive reference for all accepted PSRs including PSR-1,3,4,6,7,11,12,13,14,15,16,17,18,20. Use for PSR selection decisions and compliance audits.

PSR Overview Knowledge

What is PSR?

PSR (PHP Standards Recommendations) are specifications published by the PHP Framework Interoperability Group (PHP-FIG). They establish common standards for PHP code to ensure interoperability between frameworks and libraries.

Accepted PSRs Summary

PSRNameCategoryStatus
PSR-1Basic Coding StandardCoding StyleAccepted
PSR-3Logger InterfaceLoggingAccepted
PSR-4AutoloaderAutoloadingAccepted
PSR-6Caching InterfaceCachingAccepted
PSR-7HTTP Message InterfaceHTTPAccepted
PSR-11Container InterfaceDI ContainerAccepted
PSR-12Extended Coding StyleCoding StyleAccepted
PSR-13Hypermedia LinksHypermediaAccepted
PSR-14Event DispatcherEventsAccepted
PSR-15HTTP HandlersHTTPAccepted
PSR-16Simple CacheCachingAccepted
PSR-17HTTP FactoriesHTTPAccepted
PSR-18HTTP ClientHTTPAccepted
PSR-20ClockTimeAccepted

PSR Categories

Coding Style (PSR-1, PSR-12)

Standards for writing clean, consistent PHP code.

AspectPSR-1PSR-12
ScopeBasic rulesExtended formatting
File encodingUTF-8 without BOMInherits PSR-1
Class namesStudlyCapsInherits PSR-1
Method namescamelCaseInherits PSR-1
Indentation-4 spaces
Line length-120 chars soft limit
Keywords-Lowercase

Autoloading (PSR-4)

Standard for autoloading classes from file paths.

code
Namespace Prefix → Base Directory
App\             → src/

FQCN                          → File Path
App\Domain\User\Entity\User   → src/Domain/User/Entity/User.php

HTTP (PSR-7, PSR-15, PSR-17, PSR-18)

Standards for HTTP messages, handlers, factories, and clients.

PSRPurposeKey Interfaces
PSR-7HTTP MessagesRequestInterface, ResponseInterface, StreamInterface
PSR-15HTTP HandlersMiddlewareInterface, RequestHandlerInterface
PSR-17HTTP FactoriesRequestFactoryInterface, ResponseFactoryInterface
PSR-18HTTP ClientClientInterface
code
PSR-17 (Factory) → PSR-7 (Message) → PSR-15 (Handler) → PSR-7 (Response)
                                          ↓
                                   PSR-18 (Client)

Caching (PSR-6, PSR-16)

Standards for caching implementations.

AspectPSR-6PSR-16
ComplexityFull-featuredSimple
Key interfacesCacheItemPoolInterface, CacheItemInterfaceCacheInterface
Deferred savesYesNo
Use caseComplex caching needsSimple get/set

Logging (PSR-3)

Standard for logging libraries.

php
interface LoggerInterface {
    public function emergency(string|\Stringable $message, array $context = []): void;
    public function alert(string|\Stringable $message, array $context = []): void;
    public function critical(string|\Stringable $message, array $context = []): void;
    public function error(string|\Stringable $message, array $context = []): void;
    public function warning(string|\Stringable $message, array $context = []): void;
    public function notice(string|\Stringable $message, array $context = []): void;
    public function info(string|\Stringable $message, array $context = []): void;
    public function debug(string|\Stringable $message, array $context = []): void;
    public function log(mixed $level, string|\Stringable $message, array $context = []): void;
}

DI Container (PSR-11)

Standard for dependency injection containers.

php
interface ContainerInterface {
    public function get(string $id): mixed;
    public function has(string $id): bool;
}

Events (PSR-14)

Standard for event dispatching.

php
interface EventDispatcherInterface {
    public function dispatch(object $event): object;
}

interface ListenerProviderInterface {
    public function getListenersForEvent(object $event): iterable;
}

interface StoppableEventInterface {
    public function isPropagationStopped(): bool;
}

Hypermedia (PSR-13)

Standard for hypermedia links (HATEOAS).

php
interface LinkInterface {
    public function getHref(): string;
    public function isTemplated(): bool;
    public function getRels(): array;
    public function getAttributes(): array;
}

Time (PSR-20)

Standard for clock abstraction.

php
interface ClockInterface {
    public function now(): DateTimeImmutable;
}

When to Use Each PSR

Decision Matrix

NeedPSR
Code formattingPSR-1, PSR-12
Class autoloadingPSR-4
LoggingPSR-3
Simple caching (get/set)PSR-16
Complex caching (pools, tags)PSR-6
HTTP requests/responsesPSR-7
HTTP middlewarePSR-15
Creating HTTP objectsPSR-17
HTTP client for external APIsPSR-18
Dependency injectionPSR-11
Event systemPSR-14
REST API with linksPSR-13
Testing with timePSR-20

Common Combinations

Use CasePSRs
HTTP APIPSR-7 + PSR-15 + PSR-17
HTTP ClientPSR-7 + PSR-17 + PSR-18
Web ApplicationPSR-1 + PSR-4 + PSR-12 + PSR-3 + PSR-11
CQRS/Event-DrivenPSR-14 + PSR-3 + PSR-11
MicroserviceAll of the above

PHP Package Implementations

PSR-3: Logger

PackageDescription
monolog/monologDe facto standard logger
psr/logInterface only

PSR-4: Autoloader

PackageDescription
ComposerBuilt-in autoloader

PSR-6: Cache

PackageDescription
symfony/cacheFull-featured cache
cache/filesystem-adapterFile-based cache

PSR-7/PSR-17: HTTP

PackageDescription
guzzlehttp/psr7Guzzle implementation
nyholm/psr7Lightweight implementation
laminas/laminas-diactorosLaminas implementation

PSR-11: Container

PackageDescription
php-di/php-diAutowiring DI container
league/containerFlexible container
pimple/pimpleSimple container

PSR-14: Event Dispatcher

PackageDescription
symfony/event-dispatcherSymfony implementation
league/eventLeague implementation

PSR-15: HTTP Handlers

PackageDescription
middlewares/utilsMiddleware utilities
relay/relaySimple dispatcher

PSR-18: HTTP Client

PackageDescription
guzzlehttp/guzzleFull HTTP client
symfony/http-clientSymfony HTTP client

PSR-20: Clock

PackageDescription
psr/clockInterface only
symfony/clockSymfony implementation
lcobucci/clockSimple implementation

Composer Requirements

json
{
    "require": {
        "psr/log": "^3.0",
        "psr/cache": "^3.0",
        "psr/http-message": "^2.0",
        "psr/http-factory": "^1.0",
        "psr/http-client": "^1.0",
        "psr/container": "^2.0",
        "psr/event-dispatcher": "^1.0",
        "psr/link": "^2.0",
        "psr/clock": "^1.0",
        "psr/simple-cache": "^3.0"
    }
}

Integration with DDD

Layer Mapping

DDD LayerRelevant PSRs
DomainPSR-14 (Domain Events)
ApplicationPSR-3, PSR-11, PSR-14, PSR-20
InfrastructurePSR-6, PSR-16, PSR-18
PresentationPSR-7, PSR-15, PSR-17

Example: CQRS Application

php
<?php

declare(strict_types=1);

namespace App\Application\User\Handler;

use App\Application\User\Command\CreateUserCommand;
use App\Domain\User\Entity\User;
use App\Domain\User\Repository\UserRepositoryInterface;
use Psr\EventDispatcher\EventDispatcherInterface;  // PSR-14
use Psr\Log\LoggerInterface;                       // PSR-3
use Psr\Clock\ClockInterface;                      // PSR-20

final readonly class CreateUserHandler
{
    public function __construct(
        private UserRepositoryInterface $repository,
        private EventDispatcherInterface $eventDispatcher,
        private LoggerInterface $logger,
        private ClockInterface $clock,
    ) {
    }

    public function __invoke(CreateUserCommand $command): void
    {
        $this->logger->info('Creating user', ['email' => $command->email]);

        $user = User::create(
            $command->email,
            $command->name,
            $this->clock->now(),
        );

        $this->repository->save($user);

        foreach ($user->pullEvents() as $event) {
            $this->eventDispatcher->dispatch($event);
        }
    }
}

Compliance Checklist

PSRRequired ForCheck
PSR-1All PHP projectsphpcs --standard=PSR1
PSR-12All PHP projectsphpcs --standard=PSR12
PSR-4All PHP projectscomposer dump-autoload --strict
PSR-3Projects with loggingImplement LoggerInterface
PSR-6/16Projects with cachingImplement CacheInterface
PSR-7HTTP APIsUse PSR-7 implementations
PSR-11Projects with DIImplement ContainerInterface
PSR-14Event-driven projectsImplement EventDispatcherInterface
PSR-15HTTP middlewareImplement MiddlewareInterface
PSR-17HTTP object creationUse factory interfaces
PSR-18External API callsImplement ClientInterface
PSR-20Time-sensitive codeImplement ClockInterface

See Also

  • references/accepted-psrs.md - Detailed PSR descriptions
  • references/when-to-use.md - Decision matrix for PSR selection
  • references/compatibility.md - Inter-PSR relationships
  • references/php-fig-process.md - How PSRs are created
  • assets/psr-selection-guide.md - Selection guide template