こんにちは、コバヤシです。 今回は軽量フレームワークのSlimを試していきたいと思います。
弊社で使用しているメインのフレームワークはLaravelですが、最新のLaravel9ではPHP8以上のバージョンを求められます。
しかし案件によっては、諸事情によりPHP8以上の環境を準備できない場合があり、その場合にはLaravelを使用出来ない・・なんて事になります。
そこで、もう少し低いPHPのバージョンで動くフレームワークを試して、不測の事態に備えたい、、というのが今回の狙いです。
Slimとは
SlimはPHP製の軽量なフレームワーク(マイクロフレームワーク)です。LaravelやSymfonyなどのフルスタック(全部入)のフレームワークとは違い、必要最低限の機能のみを提供することで速度が出るようになっています。
今回はPHP7.4以上で動作するSlim4を使用します。 普段使っているLaravelとは大きく違うとは思いますが、マイクロフレームワークがどんな感じなのか試してけたらと思います。
インストール
公式を参考にインストールをしていきます。
まずは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を試していきたいと思います。