Міст PSR-7

Дата оновлення перекладу 2022-11-12

Міст PSR-7

Міст PSR-7 перетворює обʼєкти HttpFoundation з та на обʼєкти, що реалізують інтерфейси HTTP-повідомлень, визначених PSR-7.

Установка

1
$ composer require symfony/psr-http-message-bridge

Note

Якщо ви встановлюєте цей компонент поза додатком Symfony, вам потрібно підключити файл vendor/autoload.phpу вашому коді для включення механізму автозавантаження класів, наданих Composer. Детальніше можна прочитати у цій статті.

Міст також потребує реалізації PSR-7 та PSR-17, щоб перетворювати обʼєкти HttpFoundation на обʼєкти PSR-7. Наступна команда встановлює бібліотеку nyholm/psr7, легку та швидку реалізацію PSR-7, але ви можете використати будь-яку з бібліотек, що реалізують psr/http-factory-implementation:

1
$ composer require nyholm/psr7

Використання

Перетворення з обʼєктів HttpFoundation на PSR-7

Міст надає інтерфейс фабрики під назвою HttpMessageFactoryInterface, який будує обʼєкти, що реалізують інтерфейси PSR-7 з обʼєктів HttpFoundation. Він також надає реалізацію за замовчуванням, використовуючи Zend Diactoros внутрішньо.

Наступний уривок коду пояснює, як перетворити Request на Zend Diactoros ServerRequest, реалізуючи інтерфейс ServerRequestInterface:

1
2
3
4
5
6
7
8
9
10
use Nyholm\Psr7\Factory\Psr17Factory;
use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory;
use Symfony\Component\HttpFoundation\Request;

$symfonyRequest = new Request([], [], [], [], [], ['HTTP_HOST' => 'dunglas.fr'], 'Content');
// Ключ сервера HTTP_HOST повинен бути встановлений, щоб уникнути неочікуваної помилки

$psr17Factory = new Psr17Factory();
$psrHttpFactory = new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory);
$psrRequest = $psrHttpFactory->createRequest($symfonyRequest);

І тепер з Response на клас Response, що реалізує інтерфейс ResponseInterface:

1
2
3
4
5
6
7
8
9
use Nyholm\Psr7\Factory\Psr17Factory;
use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory;
use Symfony\Component\HttpFoundation\Response;

$symfonyResponse = new Response('Content');

$psr17Factory = new Psr17Factory();
$psrHttpFactory = new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory);
$psrResponse = $psrHttpFactory->createResponse($symfonyResponse);

Перетворення обʼєктів, що реалізують інтерфейси PSR-7, на HttpFoundation

З іншої сторони, міст надає інтерфейс фабрики під назвою HttpFoundationFactoryInterface, який будує обʼєкти HttpFoundation з обʼєктів, що реалізують інтерфейси PSR-7.

Наступний код пояснює, як перетворити обʼєкт, що реалізує інтерфейс Psr\\Http\\Message\\ServerRequestInterface на екземпляр Request:

1
2
3
4
5
6
use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;

// $psrRequest - це екземпляр Psr\Http\Message\ServerRequestInterface

$httpFoundationFactory = new HttpFoundationFactory();
$symfonyRequest = $httpFoundationFactory->createRequest($psrRequest);

З обʼєкта, що реалізує Psr\\Http\\Message\\ResponseInterface, на екземпляр Response:

1
2
3
4
5
6
use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;

// $psrResponse - це екземпляр Psr\Http\Message\ResponseInterface

$httpFoundationFactory = new HttpFoundationFactory();
$symfonyResponse = $httpFoundationFactory->createResponse($psrResponse);