静的ページ

注記

このチュートリアルでは、CodeIgniterをダウンロードし、フレームワークをインストール済みであることを前提としています。

最初にやることは、静的ページを処理するためのルーティングルールを設定することです。

ルーティングルールの設定

ルーティングは、URIをコントローラーのメソッドに関連付けます。コントローラーは、単に作業を委任するのに役立つクラスです。コントローラーは後で作成します。

ルーティングルールを設定しましょう。**app/Config/Routes.php**にあるroutesファイルを開きます。

最初は、そこに存在するルートディレクティブは

<?php

use CodeIgniter\Router\RouteCollection;

/**
 * @var RouteCollection $routes
 */
$routes->get('/', 'Home::index');

このディレクティブは、コンテンツが指定されていないすべての着信リクエストが、Homeコントローラー内のindex()メソッドによって処理されることを意味します。

'/'のルートディレクティブの**後**に、次の行を追加します。

use App\Controllers\Pages;

$routes->get('pages', [Pages::class, 'index']);
$routes->get('(:segment)', [Pages::class, 'view']);

CodeIgniterは、ルーティングルールを上から下へ読み取り、リクエストを最初に一致するルールにルーティングします。各ルールは、コントローラーとメソッド名(右側)にマッピングされた正規表現(左側)です。リクエストが来ると、CodeIgniterは最初の一致を探し、適切なコントローラーとメソッドを呼び出します(引数がある場合もあります)。

ルーティングに関する詳細情報は、URIルーティングにあります。

ここで、$routesオブジェクトの2番目のルールは、URIパス** /pages**へのGETリクエストに一致し、Pagesクラスのindex()メソッドにマッピングされます。

$routesオブジェクトの3番目のルールは、プレースホルダー(:segment)を使用してURIセグメントへのGETリクエストに一致し、パラメーターをPagesクラスのview()メソッドに渡します。

最初のコントローラーを作成しましょう

次にやることは、静的ページを処理する**コントローラー**を設定することです。コントローラーは、単に作業を委任するのに役立つクラスです。これは、Webアプリケーションの接着剤です。

Pagesコントローラーの作成

次のコードを使用して、**app/Controllers/Pages.php**にファイルを作成します。

重要

ファイル名の場合は、常に注意する必要があります。多くの開発者は、WindowsまたはmacOSのケースを区別しないファイルシステムで開発します。しかし、ほとんどのサーバー環境は、ケースを区別するファイルシステムを使用しています。ファイル名のケースが間違っていると、ローカルで動作するコードはサーバーでは動作しません。

<?php

namespace App\Controllers;

class Pages extends BaseController
{
    public function index()
    {
        return view('welcome_message');
    }

    public function view($page = 'home')
    {
        // ...
    }
}

view()メソッドを持つPagesという名前のクラスを作成しました。これは$pageという名前の1つの引数を受け取ります。index()メソッドも持っています。これは、**app/Controllers/Home.php**にあるデフォルトのコントローラーと同じです。そのメソッドは、CodeIgniterのウェルカムページを表示します。

注記

このチュートリアルでは、2つのview()関数が参照されています。1つはpublic function view($page = 'home')return view('welcome_message')を使用して作成されたクラスメソッドであり、ビューを表示します。どちらも技術的には関数です。しかし、クラスに関数を作成すると、それはメソッドと呼ばれます。

Pagesクラスは、CodeIgniter\Controllerクラスを拡張するBaseControllerクラスを拡張しています。これは、新しいPagesクラスがCodeIgniter\Controllerクラス(**system/Controller.php**)で定義されたメソッドとプロパティにアクセスできることを意味します。

**コントローラーは、Webアプリケーションへのすべてのリクエストの中心となるもの**です。PHPクラスと同様に、コントローラー内では$thisとして参照します。

ビューの作成

最初の手法を作成したので、基本的なページテンプレートを作成する時間です。ページのフッターとヘッダーとして機能する2つの「ビュー」(ページテンプレート)を作成します。

**app/Views/templates/header.php**にヘッダーを作成し、次のコードを追加します

<!doctype html>
<html>
<head>
    <title>CodeIgniter Tutorial</title>
</head>
<body>

    <h1><?= esc($title) ?></h1>

ヘッダーには、メインビューの読み込み前に表示したい基本的なHTMLコードと見出しが含まれています。また、後でコントローラーで定義する$title変数も出力します。次に、次のコードを含む**app/Views/templates/footer.php**にフッターを作成します

    <em>&copy; 2022</em>
</body>
</html>

注記

**header.php**テンプレートをよく見ると、esc()関数を使用しています。これは、XSS攻撃を防ぐためにCodeIgniterによって提供されるグローバル関数です。詳細については、グローバル関数と定数を参照してください。

コントローラーへのロジックの追加

home.phpとabout.phpの作成

先に、view()メソッドを持つコントローラーを設定しました。このメソッドは、読み込むページの名前である1つのパラメーターを受け取ります。

静的ページの本文は、**app/Views/pages**ディレクトリに配置されます。

そのディレクトリに、home.phpabout.php という名前の2つのファイルを作成します。これらのファイル内に、任意のテキストを入力して保存します。「Hello World!」でも構いません。

完全なPages::view()メソッド

これらのページを読み込むには、要求されたページが実際に存在するかどうかを確認する必要があります。これは、上記で作成したPagesコントローラーのview()メソッドの本体になります。

<?php

namespace App\Controllers;

use CodeIgniter\Exceptions\PageNotFoundException; // Add this line

class Pages extends BaseController
{
    // ...

    public function view($page = 'home')
    {
        if (! is_file(APPPATH . 'Views/pages/' . $page . '.php')) {
            // Whoops, we don't have a page for that!
            throw new PageNotFoundException($page);
        }

        $data['title'] = ucfirst($page); // Capitalize the first letter

        return view('templates/header', $data)
            . view('pages/' . $page)
            . view('templates/footer');
    }
}

そして、namespace行の後にuse CodeIgniter\Exceptions\PageNotFoundException;を追加して、PageNotFoundExceptionクラスをインポートします。

これで、要求されたページが存在する場合、ヘッダーとフッターを含めて読み込まれ、ユーザーに返されます。コントローラーが文字列を返す場合、それはユーザーに表示されます。

注記

コントローラーは、文字列またはResponseオブジェクトを返す必要があります。

要求されたページが存在しない場合、「404 ページが見つかりません」エラーが表示されます。

このメソッドの最初の行では、ページが実際に存在するかどうかを確認します。PHPのネイティブ関数is_file()を使用して、ファイルが期待される場所にあるかどうかを確認します。PageNotFoundExceptionは、デフォルトのエラーページを表示させるCodeIgniterの例外です。

ヘッダーテンプレートでは、$title変数を使用してページタイトルをカスタマイズしました。タイトルの値はこのメソッドで定義されていますが、変数に値を代入する代わりに、$data配列のtitle要素に代入されます。

最後に、表示する順序でビューを読み込む必要があります。これには、CodeIgniterに組み込まれているview()関数を使用します。view()関数の第2パラメーターは、ビューに値を渡すために使用されます。$data配列の各値は、キーの名前を持つ変数に割り当てられます。そのため、コントローラー内の$data['title']の値は、ビュー内の$titleと等価です。

注記

view()関数に渡されるファイル名とディレクトリ名は、実際のディレクトリとファイルの大文字と小文字と一致する必要があります。そうでないと、大文字と小文字を区別するプラットフォームでエラーが発生します。詳しくはViewsをご覧ください。

アプリの実行

テストの準備はできましたか?PHPの組み込みサーバーを使用してアプリを実行することはできません。これは、publicに提供されている.htaccessルールを正しく処理せず、URLの一部として「index.php/」を指定する必要がなくなるためです。しかし、CodeIgniterには独自の命令があります。

コマンドラインから、プロジェクトのルートで

php spark serve

と入力すると、ポート8080でアクセスできるWebサーバーが起動します。ブラウザの場所フィールドにlocalhost:8080を設定すると、CodeIgniterのウェルカムページが表示されます。

次に、localhost:8080/homeにアクセスします。Pagesコントローラーのview()メソッドに正しくルーティングされましたか?素晴らしい!

次のようなものが表示されます。

../_images/tutorial1.png

これで、ブラウザの場所フィールドにいくつかのURLを試して、上記で作成したPagesコントローラーが生成するものを確認できます…

URL

表示内容

localhost:8080/

CodeIgniterの「ウェルカム」ページ。Homeコントローラーのindex()メソッドの結果。

localhost:8080/pages

作成したPagesコントローラー内のindex()メソッドの結果。CodeIgniterの「ウェルカム」ページが表示されます。

localhost:8080/home

上記で作成した「home」ページが表示されます。これは、明示的に要求したためです。Pagesコントローラー内のview()メソッドの結果。

localhost:8080/about

上記で作成した「about」ページが表示されます。これは、明示的に要求したためです。

localhost:8080/shop

app/Views/pages/shop.phpが存在しないため、「404 - ファイルが見つかりません」エラーページが表示されます。