Slim v4 Некоторые факты (пополняется)

Фреймворк 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 происходит аналогично как везде, но на основе него можно реализовать псевдо функциональный (или интеграционный) тест. Для этого необходимо создавать (вызывать) целое приложение и работать с ним как с единым целым.

  1. Создадим класс для теста, от которого будет наследоваться в будущем
  2. Создадим методы для работы с приложением:
    Вызов инстанса приложения:
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>

Источники

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.