Шпаргалка по PSR

Шпаргалка по PSR

NikolasSumrak

Дисклеймер: По сути для повседневной разработки на базе какого-либо фреймворка нужно знать только несколько стандартов кодирования (PSR-2/PSR-12), да и те можно просто настроить в своей IDE и использовать автоформатирование кода. Скорее всего многие стандарты уже используются в вашем фреймворке.

Для удобной работы с HTTP библиотеками (например Guzzle), библиотеками кэша, сторонними логгерами - советую присмотреться к некоторым стандартам.

На мой взгляд - самые основные на данный момент - это PSR-12 и PSR-14.

Ну а если вы вдруг являетесь автором какой-либо библиотеки - то сделайте дабл-чек, возможно стоит отрефакторить чего-нибудь.


PSR-14 имеет жирный минус в интерфейсе диспетчера.

Вот как он выглядит


namespace Psr\EventDispatcher;

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

Обратите внимание на тип аргумента $event. Из-за того, что там указан object, следующий код выдаст ошибку:

class Dispatcher implements EventDispatcherInterface
{
    public function dispatch(EventInterface $event) { ... }
    // Fatal error:  Declaration of Dispatcher::dispatch(EventInterface 
    // $event) must be compatible with 
    // EventDispatcherInterface::dispatch(object $event)
}


PSR-0 - Стандарт автозагрузки

Все что нужно знать о нем сейчас - он устарел, необходимо использовать PSR-4.

Ссылки: RU ENG

PSR-1 Основной стандарт кодирования

Описывает правило создания php файлов, правила именования переменных, классов, констант, методов. Также ссылается на стандарты автозагрузки PSR-0 и PSR-4.

Ссылки: RU ENG

PSR-2 Руководство по стилю кода. Доп к PSR-1

Описывает положение скобок, пробелы вместо табов, максимальную длину строки, переносы строк и несколько других вещей. с 10 октября 2019 года устарел, вместо него предлагается использовать более новый, PSR-12

Ссылки: RU ENG

PSR-3 Logger Interface

Описывает, как должен выглядеть логгер приложения, а также предоставляет несколько интерфейсов. Посмотреть интерфейсы и классы можно по ссылкам ниже

Ссылки: RU ENG

PSR-4 Автозагрузчик

Данный PSR описывает спецификацию для автозагрузки классов на основе путей файлов. Она полностью взаимозаменяема и может использоваться в дополнение к любой другой спецификации автозагрузчика, включая PSR-0. Данный PSR также описывает, где размещать файлы, которые будут загружаться в соответствии со спецификацией.

Ссылки: RU ENG

Пример реализации

Подробности возникновения


PSR-5 - Отсутствует (в черновике)

PSR-6 Caching Interface

Описывает интерфейсы для кэширующих библиотек. В конечном счёте - разработчику не нужно будет держать в голове кучу различных реализаций кэша, т.к. всё будет стандартизировано этими интерфейсами.

Ссылки: ENG

Посмотреть реализацию на примере PHPixie ТУТ

PSR-7 HTTP message interfaces

Описывает интерфейсы HTTP сообщений, Request/Response.

Ссылки: Хабр на русском ENG

PSR-8 - Отсутствует (отказались)

PSR-9 - Отсутствует (отказались)

PSR-10 - Отсутствует (отказались)

PSR-11 - Container interface

Этот документ описывает общий интерфейс для контейнеров внедрения зависимостей. (Dependency Injection Containers)

Ссылки: ENG


PSR-12 - Обновленные стандарты кодирования.

Эта спецификация расширяет и заменяет PSR-2, руководство по стилю кодирования, и требует соблюдения PSR-1, основного стандарта кодирования.

Интересная ремарка:

В этом документе любые инструкции МОГУТ быть проигнорированы, если они не существуют в версиях PHP, поддерживаемых вашим проектом.

Быстрый пример, который отражает некоторые правила из стандарта

<?php

declare(strict_types=1);

namespace Vendor\Package;

use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
use Vendor\Package\SomeNamespace\ClassD as D;

use function Vendor\Package\{functionA, functionB, functionC};

use const Vendor\Package\{ConstantA, ConstantB, ConstantC};

class Foo extends Bar implements FooInterface
{
    public function sampleFunction(int $a, int $b = null): array
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // method body
    }
}


Полную версию разберем в следующих статьях, а самые нетерпеливые могут ознакомиться на английском, ТУТ

PSR-13 Интерфейсы определения ссылок

Гипермедиа-ссылки становятся все более важной частью Интернета как в контексте HTML, так и в различных форматах API. Тем не менее, не существует единого общего формата гипермедиа и не существует общего способа представления ссылок между форматами.

Эта спецификация направлена на то, чтобы предоставить разработчикам PHP простой, общий способ представления гипермедиа-ссылки независимо от используемого формата сериализации. Это, в свою очередь, позволяет системе сериализовать ответ с гиперссылками в один или несколько проводных форматов независимо от процесса принятия решения о том, какими должны быть эти ссылки.

Ссылки:

Пример реализации на Symfony

ENG


PSR-14 Event Dispatcher

Диспетчеризация событий - это распространенный и хорошо протестированный механизм, позволяющий разработчикам легко и последовательно вводить логику в приложение.

Целью этого PSR является создание общего механизма расширения и совместной работы на основе событий, чтобы библиотеки и компоненты могли более свободно использоваться в различных приложениях и средах.

  • Event - Событие - это сообщение, созданное Эмиттером. Это может быть любой произвольный объект PHP.
  • Listener - Слушатель - это любой вызываемый PHP, который ожидает передачи события. Ноль или более слушателей могут быть вызваны на одно и то же событие. Слушатель МОЖЕТ ставить в очередь какое-то другое асинхронное поведение, если он того пожелает.
  • Emitter - Эмиттер - это любой произвольный код, который желает отправить Событие. Это также известно как «код вызова». Он не представлен какой-либо конкретной структурой данных, но относится к варианту использования.
  • Dispatcher - Диспетчер - это сервисный объект, которому Emitter присваивает объект Event. Диспетчер несет ответственность за передачу события всем соответствующим слушателям, но ДОЛЖЕН отложить определение ответственных слушателей до поставщика слушателей.
  • Listener Provider - Провайдер Слушателя - отвечает за определение того, какие слушатели имеют отношение к данному событию, но НЕ ДОЛЖЕН вызывать сами слушатели. Провайдер слушателя может указать ноль или более соответствующих слушателей.

Ссылки:

Хабр на русском ENG


PSR-15 Обработчики HTTP запроса сервера

Описаны общие интерфейсы для обработчиков запросов (Request Handlers) а также для Middleware-компонентов. Используются HTTP сообщения из PSR-7

Приведу оба интерфейса тут

namespace Psr\Http\Server;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

/**
 * Обрабатывает запрос к серверу и выдает ответ.
 *
 * Обработчик HTTP-запроса обрабатывает HTTP-запрос, чтобы создать
 * HTTP ответ.
 */
interface RequestHandlerInterface
{
    /**
     * Обрабатывает запрос и выдает ответ.
     *
     * Может вызывать другой код для генерации ответа.
     */
    public function handle(ServerRequestInterface $request): ResponseInterface;
}


namespace Psr\Http\Server;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

/**
 * Участник обработки запроса и ответа сервера.
 *
 * HTTP Middleware участвует в обработке сообщения HTTP:
 * действуя по запросу, генерируя ответ или пересылая
 * запрос к последующему Middleware и, и, возможно, действуя на его
 * ответ.
 */
interface MiddlewareInterface
{
    /**
     * Обработать входящий запрос сервера.
     *
     * Обрабатывает входящий запрос сервера для получения ответа.
     * Если не удается получить ответ сам, он может делегировать
     * в предоставленный request handler.
     */
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface;
}


Ссылки: ENG


PSR-16 Общий интерфейс для Кеширующих библиотек

Описывает простой, но расширяемый интерфейс для Cache Item и драйвера кэша.

Приводить не буду, все по ссылке ниже.

Ссылки: ENG


PSR-17 Request/Response Factories (HTTP Factories)

Описывает интерфейсы фабрик для создания Request и Response.

Аналогично, все интерфейсы по ссылке ниже

Ссылки: ENG

PSR-18 HTTP Клиент

Описывает интерфейсы отправки и получения HTTP запросов/ответов.


Ссылка: ENG

PSR-19 Отсутствует (в черновике)

Report Page