somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【php】それぞれの役割分担

タイトルどおり、前回(【php】レイアウト読み込み処理の切り出し)にも述べたクラス化を行いました。

クラス化とコントローラーの実装

前回と比較してみてください。

<?php
require '../core/Application.php';
require '../core/Router.php';
require '../core/Request.php';

// アプリケーションのインスタンスを作成
$app = new Application();


// リクエストURIの取得
$request = new Request();
$request_uri = rtrim($request->getRequestUri(), '/');


// ルーティングの設定を取得
$router = new Router($app->getRoutes());


// URIと設定をマッチングさせる
if ($router->isExists($request_uri)) {
    // ルーティングに対応するファイルを読み込む
    ob_start();
    require '../controllers/'. $router->getRoute($request_uri) . '.php';
    require '../views/'      . $router->getRoute($request_uri) . '.php';
    $_content = ob_get_clean();

    include '../views/layout.php';

} else {
    echo 'not found';
}

変更内容は、以下のとおりです。

  • アプリケーションクラスの作成
  • リクエストクラスの作成
  • ルーティングクラスの作成
  • テンプレートから制御処理の分離
  • コントローラの作成

リクエスト、ルーティングについては単純に分担させただけです。

アプリケーションクラスは、アプリケーション全体で必要なことをまとめるクラスです。現在は、ルーティングの設定を取得するメソッドだけが実装されています。これをルーティングクラスに渡してインスタンスを作成しています。さらに、ルーティングクラスのメソッドには、リクエストクラスから取得したリクエストURIを渡して処理するソースファイルの特定をしています。

テンプレートからの制御処理の分離では、ロビーに表示するチャットの部屋数だけですが分離してみました。今までは、部屋数3をベタで書き、forに渡していました。

まず、これを変数に格納しました。その後、テンプレート同様にルーティングの設定を用いて、クラスを使用していないただのphpコントローラファイルを読み込むようにしました。このファイルの中で、テンプレートで使う変数を定義しています。

問題点

問題点は、以下のとおりです。

  • フロントコントローラでアプリケーション全体の処理をしている
  • コントローラでグローバル空間に対する変数定義をしているため、衝突を起こしてしまう可能性がある
  • クラスの読み込みが多くなり、めんどうになってきた

1つ目は、まだ修正する気はないです。いつか、アプリケーション全体を実行するメソッドを作成し、その中に移動したいと思います。

2つ目は、コントローラで用意した変数を、なにかしらの変数にまとめることで衝突を防ごうと思っています。また、テンプレートの読み込み処理を行う関数作成する予定です。これにより、渡された変数と読み込み処理だけが行われるスコープが作成されます。

最後は、クラスのオートロードを実施します。ファイルの移動や新規作成を行うたびにrequireを書くのはとても面倒です。名前空間も考慮したいと思います。

やることたくさんあって楽しいです。