Фреймворк https://www.slimframework.com/docs/v4
Стандартное приложение
$app = AppFactory::create();
$app->addRoutingMiddleware();
$app->addErrorMiddleware(true, true, true);
$app->get('/', functon(ServerRequestInterface $request, ResponseInterface $response, $args) {
return $response->getBody()->write('Hello, World!');
});
Вывод json с заголовком
Аналогично выше за исключением работы с response:
$data = [
'name' => 'App Name',
'version' => '1.0',
];
$response->getBody()
->write(json_encode($data));
return $response->withHeader('Content-Type', 'application/json');
Здесь withHeader является иммутабельным, поэтому использоваться необходимо возвращаемый объект отдельно.
Роуты
$app->get('/', [HomeAction::class, 'index']);
Здесь используется отдельный класс HomeAction в котором используется метод index внутри которого описана логика роута ‘/’.
при желании все роуты можно вынести из index.php в отдельный файл.
Тесты
в тестах при использовании объектов request, response можно использовать RequestFactory
$action = new HomeAction();
$request = (new RequestFactory())->createRequest('GET', '/');
$response = (new ResponseFactory())->createResponse();
$action->index($request, $response);
.env в приложении
для считывания из .env файла, можно воспользоваться пакетом vlucas/phpdotenv
. Но есть проблема, что при получении данных из .env файла строка false
будет восприниматься как строка. Для этого необходимо это значение провалидировать, например так:
filter_var($_ENV['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN),
Тестирование phpUnit
Тестирование в phpUnit происходит аналогично как везде, но на основе него можно реализовать псевдо функциональный (или интеграционный) тест. Для этого необходимо создавать (вызывать) целое приложение и работать с ним как с единым целым.
- Создадим класс для теста, от которого будет наследоваться в будущем
- Создадим методы для работы с приложением:
Вызов инстанса приложения:
protected function app(): App
{
$containerBuilder = new ContainerBuilder();
// some settings
// $settings = require __DIR__.'/../config/settings.php'
// $settings($containerBuilder);
$container = $containerBuilder->build();
AppFactory::setContainer($container);
$app = AppFactory::create();
// middleware
$middleware = require __DIR__.'/../../../../routes/routes.php';
$middleware($app);
// routes
$routes = require __DIR__.'/../../../../config/middleware.php';
$routes($app);
return $app;
}
// метод для создания экземпляра запроса
protected function method($method, $uri): RequestInterface
{
return (new RequestFactory())->createRequest($method, $uri);
}
// метод создания экземпляра get запроса
protected function get($uri): RequestInterface
{
return $this->method('GET', $uri);
}
// передача запроса в приложение
protected function request(ServerRequestInterface $request): ResponseInterface
{
return $this->app()->handle($request);
}
phpunit.xml и ENV переменные окружения
для настройки phpunit можно использовать файл phpunit.xml.dist в котором описываются настройки phpunit в том числе разделение на тестьюты:
<testsuites>
<testsuite name="feature">
<directory>./tests/Feature</directory>
</testsuite>
<testsuite name="unit">
<directory>./tests/Unit</directory>
</testsuite>
</testsuites>
определение переменных окружения env
<php>
<env name="APP_DEBUG" value="true"/>
</php>
Источники
- Routing — Slim Framework
- php — Mock Slim endpoint POST requests with PHPUnit — Stack Overflow
- vlucas/phpdotenv — .env loader
- Микрофреймворк slim / Хабр
- Slim-Skeleton/TestCase.php at 037cfa2b6885301fc32a5b18a00a251a534aac81 · slimphp/Slim-Skeleton
- Getting started — The Dependency Injection Container for humans
- 3. Конфигурационный XML-файл — Руководство PHPUnit на русском языке latest