HTTP-фабрики
В этом документе описан общий стандарт для фабрик, создающих HTTP-объекты, соответствующие PSR-7.
В PSR-7 не было рекомендаций по созданию объектов HTTP, что приводит к трудностям при необходимости создания новых объектов HTTP внутри компонентов, не привязанных к конкретной реализации PSR-7.
Интерфейсы, описанные в этом документе, описывают методы, с помощью которых можно создавать экземпляры объектов PSR-7.
Ключевые слова «ДОЛЖЕН», «НЕ ДОЛЖЕН», «ТРЕБУЕТСЯ», «ДОЛЖЕН», «НЕ ДОЛЖЕН», «СЛЕДУЕТ», «НЕ ДОЛЖЕН», «РЕКОМЕНДУЕТСЯ», «МОЖЕТ» и «ДОПОЛНИТЕЛЬНО» в этом документе: интерпретироваться, как описано в RFC 2119.
1. Спецификация
Фабрика HTTP — это метод, с помощью которого создается новый объект HTTP, определенный PSR-7. Фабрики HTTP ДОЛЖНЫ реализовать эти интерфейсы для каждого типа объекта, предоставляемого пакетом.
2. Интерфейсы
Следующие интерфейсы МОГУТ быть реализованы вместе в одном классе или в отдельных классах.
2.1 RequestFactoryInterface
Имеет возможность создавать клиентские запросы.
namespace Psr\Http\Message;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;
interface RequestFactoryInterface
{
/**
* Создает новый запрос
*
* @param string $method Метод HTTP, связанный с запросом.
* @param UriInterface|string $uri URI, связанный с запросом.
*/
public function createRequest(string $method, $uri): RequestInterface;
}
2.2 ResponseFactoryInterface
Имеет возможность создавать ответы.
namespace Psr\Http\Message;
use Psr\Http\Message\ResponseInterface;
interface ResponseFactoryInterface
{
/**
* Создает новый ответ.
*
* @param int $code Код состояния HTTP. По умолчанию 200.
* @param string $reasonPhrase Фраза причины, которую необходимо связать
с кодом состояния в сгенерированном ответе. Если ничего не указано,
реализации МОГУТ использовать значения по умолчанию, предложенные
в спецификации HTTP.
*/
public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface;
}
2.3 ServerRequestFactoryInterface
Имеет возможность создавать запросы к серверу.
namespace Psr\Http\Message;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UriInterface;
interface ServerRequestFactoryInterface
{
/**
* Создает новый запрос к серверу.
*
* Обратите внимание, что параметры сервера принимаются точно такими,
какими они заданы — никакой синтаксический анализ/обработка заданных
значений не производится. В частности, не предпринимается никаких
попыток определить метод HTTP или URI, которые должны быть указаны явно.
*
* @param string $method Метод HTTP, связанный с запросом.
* @param UriInterface|string $uri URI, связанный с запросом.
* @param array $serverParams Массив параметров API сервера (SAPI),
с помощью которых можно заполнить сгенерированный экземпляр запроса.
*/
public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface;
}
2.4 StreamFactoryInterface
Имеет возможность создавать потоки запросов и ответов.
namespace Psr\Http\Message;
use Psr\Http\Message\StreamInterface;
interface StreamFactoryInterface
{
/**
* Создает новый поток из строки.
*
* Поток СЛЕДУЕТ создавать с использованием временного ресурса.
*
* @param string $content Строковое содержимое, которым будет заполнен поток.
*/
public function createStream(string $content = ''): StreamInterface;
/**
* Создает поток из существующего файла.
*
* Файл ДОЛЖЕН быть открыт в заданном режиме,
который может быть любым режимом, поддерживаемым функцией fopen.
*
* `$filename` МОЖЕТ быть любой строкой, поддерживаемой `fopen()`.
*
* @param string $filename Имя файла или URI потока, который будет использоваться в качестве основы потока.
* @param string $mode Режим открытия основного имени файла/потока.
*
* @throws \RuntimeException Если файл не открывается.
* @throws \InvalidArgumentException Если режим недействителен.
*/
public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface;
/**
* Создает новый поток из существующего ресурса.
*
* Поток ДОЛЖЕН быть доступен для чтения и записи.
*
* @param resource $resource Ресурс PHP, который будет использоваться в качестве основы для потока.
*/
public function createStreamFromResource($resource): StreamInterface;
}
Реализациям этого интерфейса СЛЕДУЕТ использовать временный поток при создании ресурсов из строк. РЕКОМЕНДУЕМЫЙ способ сделать это:
$resource = fopen('php://temp', 'r+');
2.5 UploadedFileFactoryInterface
Имеет возможность создавать потоки для загружаемых файлов.
namespace Psr\Http\Message;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UploadedFileInterface;
interface UploadedFileFactoryInterface
{
/**
* Создает новый загруженный файл.
*
* Если размер не указан, он будет определен путем проверки размера потока.
*
* @link http://php.net/manual/features.file-upload.post-method.php
* @link http://php.net/manual/features.file-upload.errors.php
*
* @param StreamInterface $stream Базовый поток, представляющий загруженное содержимое файла.
* @param int $size Размер файла в байтах.
* @param int $error Ошибка загрузки файла PHP.
* @param string $clientFilename Имя файла, предоставленное клиентом, если таковое имеется.
* @param string $clientMediaType Тип носителя, предоставленный клиентом, если таковой имеется.
*
* @throws \InvalidArgumentException Если файловый ресурс не доступен для чтения.
*/
public function createUploadedFile(
StreamInterface $stream,
int $size = null,
int $error = \UPLOAD_ERR_OK,
string $clientFilename = null,
string $clientMediaType = null
): UploadedFileInterface;
}
2.6 UriFactoryInterface
Имеет возможность создавать URI для запросов клиента и сервера.
namespace Psr\Http\Message;
use Psr\Http\Message\UriInterface;
interface UriFactoryInterface
{
/**
* Create a new URI.
*
* @param string $uri URI для анализа.
*
* @throws \InvalidArgumentException Если данный URI не может быть проанализирован.
*/
public function createUri(string $uri = '') : UriInterface;
}