【Laravel】静的ページのジェネレーターとして利用してみよう!

LaravelはWebサイトを構築する上で必要な機能を備えた便利なWebアプリケーションフレームワークです。ただ、静的ページのみで構成する場合は色々な機能を通すため遅くなるデメリットもあります。今回、Laravelをサイト表示に使うのではなく、サイト生成のジェネレーターとして利用してみます。

ジェネレーターとは?

ジェネレーターは商品の性能ページなど決まったフォーマットで掲載するページをビルドにて大量生成します。生成ファイルは静的なHTMLとなります。

必要な環境

Laravel5.5以上の環境で動作できる状態

生成の流れ

Laravelには標準でデータベースを扱うクエリビルダとBladeテンプレートが導入されています。上記で処理を行って表示するHTMLをstorageディレクトリに保存するようにして表示と生成を並行に行います。

作業手順 (簡易ページ生成)

簡易な生成を行うためLaravel標準の welcome.blade.php の内容を静的ページとして出力してみます。

作業用のコントローラを生成

artisanコマンドを利用して作業用のコントローラファイルを生成します。
ファイル名は任意で問題ありません。

php artisan make:controller PageController

ルーティング設定の書き換え

生成した作業用コントローラファイルを利用するようにルーティング設定を変更します。

# 下記コメント化して追記
# Route::get('/', function () {
#    return view('welcome');
# });

Route::get('/', 'PageController@index');

作業用コントローラファイルに処理を追加

artisanコマンドで生成したコントローラファイルに内容を追加します。
後でデータベースの取得も行う為、クエリビルダも使えるようにします。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;  # <= 追記

class PageController extends Controller {
    public function index(){        # <= 追記
        return view('welcome');
    }
}

Welcomeページの表示を確認

ブラウザを利用してWelcomeページが正常に表示されていることを確認します。

表示ページを保存するように設定

先ほど表示したページを静的ページとして保存するようにコントローラを変更します。設定変更を行うことでブラウザで表示したときに並行で静的ページが生成されます。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class PageController extends Controller {
    public function index(){
        $html = view('welcome')->render();  # <= 追記
        file_put_contents(storage_path("app/public/index.html"), $html);

        return view('welcome');
    }
}

生成されたページは /storage/app/public/ ディレクトリに出力されます。
上記で簡易なページ生成の流れは完了となります。

作業手順 (大量のページ生成)

大量のページを生成するケースを考えます、商品データをMySQLの items テーブルに保管していてそれを利用するケースを考えます。
商品データには id があり[ID].html の名前で静的ページを保管する事を想定しています。

ルーティング設定の追記

商品ページを表示するルーティング設定を追加します。

Route::get('/item/{id}.html', 'PageController@item')->where('id', '[0-9]+');

作業用コントローラファイルに処理を追加

コントローラファイルに商品ページを表示するためのファンクションを追加します。処理の中ではクエリビルダで商品情報を取得します。

class PageController extends Controller {
    public function item($item_id){        # <= 追記
        $item = DB::table('items')->where('id', $item_id)->first();

        return view('item', compact('item'));
    }
}

商品ページの表示を確認

商品ページが正常に表示されていることを確認します。
この記事では商品ページの bladeテンプレートの生成は記載しません。

表示ページを保存するように設定

先ほど表示したページを静的ページとして保存するようにコントローラを変更します。先ほどと違う点としてhtmlのファイル名は [ID].html で保存するようにしています。

class PageController extends Controller {
    public function item($item_id){
        $item = DB::table('items')->where('id', $item_id)->first();

        $html = view('item', compact('item'))->render();  # <= 追記
        file_put_contents(storage_path("app/public/". $item_id .".html"), $html);

        return view('item', compact('item'));
    }
}

上記、終了後ページを表示することで商品ページが生成されます。
大量にページがある場合は Laravelに搭載されているテスト処理でHTTPリクエストを行うことで簡単に生成できます。

HTTPリクエスト処理を生成

artisanコマンドでテスト処理を生成します。テストのファイル名は任意です。

php artisan make:test PageCreate

テスト処理の設定を書き換え

生成したテスト処理の設定を変更します。
商品ページはfor文で1から100までIDを回すようにしています。
上記をクエリビルダを利用してデータベースの商品ID全てを回すように改修すれば全商品の静的ページが生成されます。

class PageTest extends TestCase {
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function testExample(){

       # この処理で welcomeページ が生成されます。
        $response = $this->get('/');
        $response->assertOk();

       # この処理で 商品ページ が生成されます。
     for($tmp_no = 1; $tmp_no <= 100; $tmp_no++){
            $response = $this->get('/item/' . $tmp_no . '.html');
            $response->assertOk();
        }

    }

気がついた点・補足情報

  • /storage/app/public/ ディレクトリの中にはCSS, JSがないため後で追加が必要
  • bladeテンプレートで url() を使うと静的ページにドメインありのURLが記載されてしまう。スラッシュ始まりの絶対パスで記載