- Документация
- Slim 4 Изменения
- Установка
- Заготовки
- Ошибка 404
- Получение текущего маршрута
- Получение аргументов текущего маршрута
- Доступ к парсеру маршрутов (Route Parser)
- Получение базового пути (base path)
- Получение ответа (response body)
- Получение входных данных
- CSRF защита
- SameSite cookies
- Внедрение зависимости
Документация
Slim 4 Изменения
Установка
Заготовки
Ошибка 404
Вначале у многих людей возникает проблема с сообщением об ошибке: Ошибка 404 (не найдено)
Сначала убедитесь, что вы добавили RoutingMiddleware:
$app = AppFactory::create();
// Add Routing Middleware
$app->addRoutingMiddleware();
// ...
$app->run();
Далее, убедитесь, что установлен правильный базовый путь (base path):
$app->setBasePath('/my-base-path');
Данная библиотека может быть использована для определения и установки корректного базового пути:
Получение текущего маршрута
$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 (антипаттерн) был «стилем» по умолчанию для внедрения всего контейнера и извлечения из него зависимостей.
- Service Locator прятал реальные зависимости от вашего класса.
- Service Locator нарушает принцип инверсии управления (IoC) в SOLID.
Вопрос: Как лучше сделать?
Ответ: Использовать композицию вместо наследования и конструктор внедрения зависимостей. Внедрение зависимостей - процесс предоставления внешней зависимости программному компоненту.
Начиная с Slim 4, вы можете использовать современный контейнер внедрения зависимостей (Dependency Injection Container - DIC), такой как PHP-DI и league / container. Это значит, что теперь вы можете явно объявить все зависимости в своем конструкторе и позволить DIC внедрить эти зависимости за вас.
Чтобы быть более ясным: «Композиция» не имеет ничего общего с функцией «Autowire» DIC. Вы можете использовать композицию с чистыми классами и без контейнера или чего-либо еще. Функция autowire просто использует классы PHP Reflection для автоматического разрешения и вставки зависимостей.