Hello Worldの実装例

Naifyを最小構成で動かす実装例を紹介します。ブートストラップ、ルート定義、ハンドラ実装の3点だけを押さえれば、まず1本動かせます。

最初の1本として読むページ。 まずここで最小構成を掴み、そのあと必要に応じてDB、NaifyView、Session、エラーハンドリングへ進むと流れが自然です。

ファイル配置

プロジェクト直下に libs/Naify を配置し、Webサーバーの公開ディレクトリを public に設定します。PHPファイルには先頭に <?php を付けます。

[project]/
├── libs/Naify/
├── SampleAppBootstrap.php
├── public/index.php
├── config/
├── routes/routes.php
└── app/Controllers/IndexController.php

公開する入口はpublic/index.phpです。ここからプロジェクト直下のブートストラップを読み込みます。

// public/index.php
require dirname(__DIR__) . '/SampleAppBootstrap.php';

まず /index.php へアクセスして確認します。以降のURL例では、未解決のリクエストをこの入口へ渡すWebサーバー設定を前提とします。

ブートストラップ

Naifyを初期化し、Application / Routerを作って、ルート定義を読み込みます。

// SampleAppBootstrap.php(プロジェクト直下)
use Naify\Naify;

require __DIR__ . '/libs/Naify/Naify.php';

Naify::boot();
Naify::autoload('App', __DIR__ . '/app');

$config = Naify::createConfig()
    ->setAppId('sample-app')
    ->setSystemDir(__DIR__)
    ->setPublicDir(__DIR__ . '/public')
    ->setConfigDir(__DIR__ . '/config')
    ->setBasePath($_SERVER['SCRIPT_NAME'] ?? '/');

$app = Naify::createWebApp($config);
$app->loadRoute('routes/routes.php');
$app->run();

ルート定義

このサンプルでは routes/routes.php にまとめて置きます。まずは1ルートだけで十分です。

// routes/routes.php
use Naify\Router\Router;

return static function (Router $router): void
{
    $to = $router->createRouteFactory('App\\Controllers\\');
    $router->any('/', $to('IndexController::index'));
};

ハンドラ実装

Naifyが要求するのは RequestContextHandlerInterface の実装です。Controllerはその代表例です。

namespace App\Controllers;

use Naify\Router\RequestContext;
use Naify\Router\RequestContextHandlerInterface;

class IndexController implements RequestContextHandlerInterface
{
    private RequestContext $context;

    public function handle(RequestContext $context, ?string $action): void
    {
        $this->context = $context;
        $action ??= $context->getUrlParam('action', 'index');
        $action .= 'Action';
        $this->{$action}();
    }

    public function indexAction(): void
    {
        echo '<h1>Hello, Naify!</h1>';
    }
}