Slim 4 - FAQ



Документация

docs/v4/

Slim 4 Изменения

Установка

Заготовки

 

Ошибка 404

Вначале у многих людей возникает проблема с сообщением об ошибке: Ошибка 404 (не найдено)

Сначала убедитесь, что вы добавили RoutingMiddleware:

$app = AppFactory::create();

// Add Routing Middleware
$app->addRoutingMiddleware();

// ...
$app->run();


Далее, убедитесь, что установлен правильный базовый путь (base path):

$app->setBasePath('/my-base-path');

Запуск Slim 4 из подпапки

Данная библиотека может быть использована для определения и установки корректного базового пути:

 

Получение текущего маршрута

$route = \Slim\Routing\RouteContext::fromRequest($request)->getRoute();

 

Получение аргументов текущего маршрута

$routeArguments = \Slim\Routing\RouteContext::fromRequest($request)
    ->getRoute()
    ->getArguments();

 

Доступ к парсеру маршрутов (Route Parser)

$routeParser = \Slim\Routing\RouteContext::fromRequest($request)->getRouteParser();

 

Получение базового пути (base path)

$basePath = \Slim\Routing\RouteContext::fromRequest($request)->getBasePath(),

 

Получение ответа (response body)

$body = (string)$request->getBody();

Если ответ пустой, это может быть ошибка или проблема с фрагментированными запросами (EN)

 

Получение входных данных

Чтобы получить отправленные данные JSON / XML, вам необходимо добавить BodyParsingMiddleware:

$app = AppFactory::create();

$app->addBodyParsingMiddleware(); // <--- here

// ...
$app->run();

Важно: BodyParsingMiddleware будет анализировать данные только в том случае, если заголовок запроса Content-Type содержит поддерживаемое значение. Поддерживаются следующие значения:

  • application/json
  • application/x-www-form-urlencoded
  • application/xml
  • text/xml

BodyParsingMiddleware также поддерживает PUT запросы.

Больше информации: slim-4-application

CSRF защита

Можно воспользоваться пакетом Slim-CSRF.

SameSite cookies

С SameSite Cookies (доступны с PHP 7.3) вам может больше не понадобиться защита CSRF:

 

Внедрение зависимости

Основное правило:

Все ваше приложение не должно знать о контейнере.

Создание контейнера - это антипаттерн. Вместо этого явно объявите все зависимости классов в своем конструкторе.

Почему создание контейнера (в большинстве случаях) это антипаттерн?

В Slim 3 Service Locator (антипаттерн) был «стилем» по умолчанию для внедрения всего контейнера и извлечения из него зависимостей.

Вопрос: Как лучше сделать?

Ответ: Использовать композицию вместо наследования и конструктор внедрения зависимостей. Внедрение зависимостей - процесс предоставления внешней зависимости программному компоненту.

Начиная с Slim 4, вы можете использовать современный контейнер внедрения зависимостей (Dependency Injection Container - DIC), такой как PHP-DI и league / container. Это значит, что теперь вы можете явно объявить все зависимости в своем конструкторе и позволить DIC внедрить эти зависимости за вас.

Чтобы быть более ясным: «Композиция» не имеет ничего общего с функцией «Autowire» DIC. Вы можете использовать композицию с чистыми классами и без контейнера или чего-либо еще. Функция autowire просто использует классы PHP Reflection для автоматического разрешения и вставки зависимостей.






comments powered by Disqus