PSR-7, интерфейсы и как оно все работает?

Вопрос не имеет отношения к MODX и если это вас возмущает, то заранее простите.
Просто хочу воспользоваться опытом куда более опытных разработчиков и спросить вот о чем.
Есть стандарт PSR-7 который описывает объектную обертку для запросов и ответов сервера.
ссылка www.php-fig.org/psr/psr-7/
Стандарт дает различные интерфейсы с методами для работы с запросом и ответом. вернее только объявления методов. так как это интерфейс.
Есть фреймворки. строго следующие этим стандартам. К примеру Slim.
И вот какие вопросы у меня возникают:
1. Во входной скрипте подключаются интерфейсы, а не классы.
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
Но при этом в программе я могу обращаться к объекту request и к его методам. Как так то? Это у меня огромный пробел в знаниях и только интерфейса достаточно чтобы иметь объект?
2. В коде я могу обратиться к любому методу, описанному в интерфейсе и он сделает свое дело. К примеру
$app->get('/',function(Request $request, Response $response, $args) {
    $result = $request->getQueryParams();

    $twig = $this->get('twig');
    $str = $twig->render('index.tpl',['name'=>$result['name']]);
    $response->getBody()->write($str);
    return $response;
});
Тоесть у запроса я могу обратиться к методу getQueryParams(), а у ответа к getBody()
Но где прописана реализация этих методов из стандарта psr-7? Раз они работают, значит где то должна быть прописана их логика, но в моем коде реализация нигде не прописывается. Кто то знает как это устроено? Реализация прописана в самом php?
Александр Мельник
13 октября 2019, 15:01
modx.pro
870
0

Комментарии: 4

Сергей Шлоков
13 октября 2019, 19:36
0
В комментарии это не обьяснишь. Попробуй почитать тут. Но ты как-то широко шагнул. Сначала нужно базовые знания получить, а потом усложнять.
Интерфейсы дают малую связанность. Т.е. ты можешь подсунуть в метод любой класс, соответствующий определенным требованиям. За это как раз и отвечает интерфейс.

Но где прописана реализация этих методов из стандарта psr-7?
У того же Slim эти классы пробрасываются при инициализации приложения. В нем жестко прописана проверка наличия нескольких пакетов. Сначала свой пакет, потом Guzzle и ещё какие то. Не помню. Но можно и самому инстанциировать любой свой класс запроса или ответа. Главное, чтобы соответствовал интерфейсу. Иначе будет ошибка.

Есть фреймворки. строго следующие этим стандартам. К примеру Slim.
Тройка ещё не соответствует. Например, $response->toJson() не соответствует стандарту. А вот четверка поддерживает почти все текущие утвержденные стандарты. После тройки приходится привыкать. И всякие методы обработки запроса и ответа выносить на сервисный уровень.
    Александр Мельник
    13 октября 2019, 21:20
    0
    Да вы правы, тут сложно ответить в формате комментария.
    Да и мои вопросы они странные что ли.
    У того же Slim эти классы пробрасываются при инициализации приложения.
    В том то и дело что в 4 версии я не вижу классов от которых создан объект response или request
    Может сильно полагаюсь на возможности phpStorm и его анализ классов и нужно пройти жизненный путь приложения от начала до конца. Но признаюсь, синтаксис в slim4 мне сложноват, он прям на полную использует все нововведения седьмых версий php и часто этот синтаксис сложно читать.
    Я на данном этапе решил, что методы из интерфейса psr-7 (и psr-15 ) вшиты в сам php. Как например методы PDO. Ведь для работы с PDO не нужно реализовывать методы, мы просто к ним обращаемся.
      Сергей Шлоков
      13 октября 2019, 23:01
      0
      Мы раньше вроде были на «ты». Я так постарел?

      Обрати внимание на метод $app->run();
      В нём вызываются конкретные классы. Причем, если не указан конкретный реквест, то он определяется автоматически по установленным пакетам (я выше писал).

      Но признаюсь, синтаксис в slim4 мне сложноват, он прям на полную использует все нововведения седьмых версий php
      А мне безумно нравится. В пекло PHP 5. ))

      Я на данном этапе решил, что методы из интерфейса psr-7 (и psr-15 ) вшиты в сам php.
      Найн. Ю а ронг.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
4