軽量フレームワーク Slimを試す - インストール編

こんにちは、コバヤシです。 今回は軽量フレームワークのSlimを試していきたいと思います。

弊社で使用しているメインのフレームワークはLaravelですが、最新のLaravel9ではPHP8以上のバージョンを求められます。
しかし案件によっては、諸事情によりPHP8以上の環境を準備できない場合があり、その場合にはLaravelを使用出来ない・・なんて事になります。
そこで、もう少し低いPHPのバージョンで動くフレームワークを試して、不測の事態に備えたい、、というのが今回の狙いです。

Slimとは

SlimはPHP製の軽量なフレームワーク(マイクロフレームワーク)です。LaravelやSymfonyなどのフルスタック(全部入)のフレームワークとは違い、必要最低限の機能のみを提供することで速度が出るようになっています。

www.slimframework.com

今回はPHP7.4以上で動作するSlim4を使用します。 普段使っているLaravelとは大きく違うとは思いますが、マイクロフレームワークがどんな感じなのか試してけたらと思います。

インストール

公式を参考にインストールをしていきます。  

www.slimframework.com

まずはslim本体をインストールします。

composer require slim/slim:"4.*"

次にPSR-7インターフェースの実装をインストールします。今回はSlimフレームワークのものをイントールします。

composer require slim/psr7

vendorと同じディテクトリにpublicディテクトリを作成してドキュメントルートに設定します。
そして、public/index.phpを作成します。

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->get('/', function (Request $request, Response $response, $args) {
    $response->getBody()->write("Hello world!");
    return $response;
});

$app->run();

そしてブラウザでアクセスすると、、Hello world!と表示されます。 まずは一段落といったところですが、ここから必要なものを一つずつ入れていかなければなりません。。(ルーターやDIなどなど、、、)

一からしっかりと組みたい場合はこれで良いのですが、 今回はとりあえず組んでみるのが目的なので、ここまでやってあれですがスケルトンを使用したインストールに変更します。
(公式も最初からスケルトンを使用したインストールを最初に書いてほしいところ。。)

スケルトンからインストール

スケルトンを使用したインストールを行うと、以下の構成になるとのこと。

・ルーター:nikic/fast-route
・DI: php-di/php-di
・ロギング:monolog/monolog

composer create-project slim/slim-skeleton myapp

これだけで、インストール完了。
myapp/publicをドキュメントルートに設定して、アクセスすればHello world!と表示されます。

ファイル構成はこんな感じです。

├── app
│   ├── dependencies.php
│   ├── middleware.php
│   ├── repositories.php
│   ├── routes.php
│   └── settings.php
├── composer.json
├── composer.lock
├── docker-compose.yml
├── logs
├── phpstan.neon.dist
├── phpunit.xml
├── public
│   └── index.php
├── src
│   ├── Application
│   ├── Domain
│   └── Infrastructure
├── tests
│   ├── Application
│   ├── Domain
│   ├── Infrastructure
│   ├── TestCase.php
│   └── bootstrap.php
├── var
│   └── cache
└── vendor

通常のインストールには無かった、routes.phpやsettings.phpなどのファイルがありますね。
ベースとなるものは入っているので、ここからはさらに必要なものを入れていくことになります。

テンプレートエンジンをインストール

テンプレートエンジンとしてtwigを入れていきます。

composer require slim/twig-view

app/dependencies.phpを以下のように書き換え

<?php
declare(strict_types=1);
  
use App\Application\Settings\SettingsInterface;
use DI\ContainerBuilder;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Monolog\Processor\UidProcessor;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Slim\Views\Twig; // 追記
use App\Application\Settings\Settings; // 追記
  
return function (ContainerBuilder $containerBuilder) {
    $containerBuilder->addDefinitions([
        LoggerInterface::class => function (ContainerInterface $c) {
            $settings = $c->get(SettingsInterface::class);

            $loggerSettings = $settings->get('logger');
            $logger = new Logger($loggerSettings['name']);

            $processor = new UidProcessor();
            $logger->pushProcessor($processor);

            $handler = new StreamHandler($loggerSettings['path'], $loggerSettings['level']);
            $logger->pushHandler($handler);

            return $logger;
        },
        Twig::class => function (ContainerInterface $container) { // 追記
            $settings = $container->get(SettingsInterface::class); // 追記
            return Twig::create(__DIR__ . '/../templates', $settings->get('twig')); // 追記
        }, // 追記
    ]);
};

app/settings.phpを以下のように書き換え

<?php
declare(strict_types=1);
  
use App\Application\Settings\Settings;
use App\Application\Settings\SettingsInterface;
use DI\ContainerBuilder;
use Monolog\Logger;
  
return function (ContainerBuilder $containerBuilder) {
  
    // Global Settings Object
    $containerBuilder->addDefinitions([
        SettingsInterface::class => function () {
            return new Settings([
                'displayErrorDetails' => true, // Should be set to false in production
                'logError'            => false,
                'logErrorDetails'     => false,
                'logger' => [
                    'name' => 'slim-app',
                    'path' => isset($_ENV['docker']) ? 'php://stdout' : __DIR__ . '/../logs/app.log',
                    'level' => Logger::DEBUG,
                ],
                'twig' => [ // 追記
                    'strict_variables' => true, // 追記
                    'cache' => __DIR__ . '/../var/cache/twig', // 追記
                ], // 追記
            ]);
        }
    ]);
};

app/middleware.phpを以下のように書き換え

<?php
declare(strict_types=1);
  
use App\Application\Middleware\SessionMiddleware;
use Slim\App;
use Slim\Views\Twig; // 追記
use Slim\Views\TwigMiddleware; // 追記
  
return function (App $app) {
    $app->add(SessionMiddleware::class);
    $app->add(TwigMiddleware::createFromContainer($app, Twig::class)); // 追記
};

app/routes.phpを以下に書き換え

<?php
declare(strict_types=1);

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\App;
use Slim\Views\Twig;

return function (App $app) {
    $app->get('/', function (Request $request, Response $response) use ($app) {
        $twig = $app->getContainer()->get(Twig::class);
        return $twig->render($response, 'index.twig', []);
    });
};

/templates/index.twigを作成

<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <title>Slim4テスト</title>
</head>
<body>

Hello world

</body>
</html>

これで、twigを使用してHello worldが表示されました。

まとめ

まずは、最低限のインストールだけやってみましたが、さすがマイクロフレームワークだけあって何も入っておらず必要なものは自分で入れて作り上げていく形です。 一度自分なりの構成などを決めてしまえば簡単に構築できそうですが、それまでが試行錯誤しそうですね。
次回もSlimを試していきたいと思います。