Awesome-claude-code psr-overview-knowledge

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.

install
source · Clone the upstream repo
git clone https://github.com/dykyi-roman/awesome-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/dykyi-roman/awesome-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/psr-overview-knowledge" ~/.claude/skills/dykyi-roman-awesome-claude-code-psr-overview-knowledge && rm -rf "$T"
manifest: skills/psr-overview-knowledge/SKILL.md
source content

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.

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 Messages
RequestInterface
,
ResponseInterface
,
StreamInterface
PSR-15HTTP Handlers
MiddlewareInterface
,
RequestHandlerInterface
PSR-17HTTP Factories
RequestFactoryInterface
,
ResponseFactoryInterface
PSR-18HTTP Client
ClientInterface
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 interfaces
CacheItemPoolInterface
,
CacheItemInterface
CacheInterface
Deferred savesYesNo
Use caseComplex caching needsSimple get/set

Logging (PSR-3)

Standard for logging libraries.

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.

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

Events (PSR-14)

Standard for event dispatching.

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).

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.

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/monolog
De facto standard logger
psr/log
Interface only

PSR-4: Autoloader

PackageDescription
ComposerBuilt-in autoloader

PSR-6: Cache

PackageDescription
symfony/cache
Full-featured cache
cache/filesystem-adapter
File-based cache

PSR-7/PSR-17: HTTP

PackageDescription
guzzlehttp/psr7
Guzzle implementation
nyholm/psr7
Lightweight implementation
laminas/laminas-diactoros
Laminas implementation

PSR-11: Container

PackageDescription
php-di/php-di
Autowiring DI container
league/container
Flexible container
pimple/pimple
Simple container

PSR-14: Event Dispatcher

PackageDescription
symfony/event-dispatcher
Symfony implementation
league/event
League implementation

PSR-15: HTTP Handlers

PackageDescription
middlewares/utils
Middleware utilities
relay/relay
Simple dispatcher

PSR-18: HTTP Client

PackageDescription
guzzlehttp/guzzle
Full HTTP client
symfony/http-client
Symfony HTTP client

PSR-20: Clock

PackageDescription
psr/clock
Interface only
symfony/clock
Symfony implementation
lcobucci/clock
Simple implementation

Composer Requirements

{
    "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 PSRsNote
DomainPSR-3, PSR-14, PSR-20PSR interfaces are pure contracts — acceptable in Domain
ApplicationPSR-3, PSR-11, PSR-14, PSR-20Service orchestration layer
InfrastructurePSR-6, PSR-16, PSR-18Implementation layer
PresentationPSR-7, PSR-15, PSR-17HTTP layer

Important: PSR packages (

psr/log
,
psr/clock
,
psr/event-dispatcher
) contain only interfaces — no implementation code. They are PHP community standards equivalent to a standard library. Using PSR interfaces in Domain layer is acceptable and common practice. What is NOT acceptable in Domain: implementation packages like
monolog/monolog
,
symfony/cache
,
guzzlehttp/guzzle
.

Example: CQRS Application

<?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 projects
phpcs --standard=PSR1
PSR-12All PHP projects
phpcs --standard=PSR12
PSR-4All PHP projects
composer 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
psr-overview-knowledge — OpenSkillIndex