初めてのPHP ⑤。ルーティングの設定

初めてのPHP ⑤。ルーティングの設定
この記事はこんな悩みを解決します
  • PHPでのルーティングの設定方法が知りたい
  • ページを移動する時の汎用性の高いコードが書きたい
  • PHPを勉強したい

aタグをクリックして別のページに移動するなどの処理をするときにルーティングという設定が必要となります。この設定をすることで各ページから渡って来た情報を処理してユーザーに返すという作業が簡単にできるようになります。

この記事を読むことでPHPでのルーティングの設定方法がわかります。

初めてのPHP ⑤。ルーティングの設定方法

よく使われるのがRouteを設定しておき、index.phpに渡って来たURIに対してRouteに登録されていれば適したコントローラーに渡すという方法です。
ちなみに、コントローラーではサーバーとの情報のやり取りなどを行いますが今回は単純にビューを返すだけに設定して行きます。

まずはビューとコントローラーを作って行きましょう。viewフォルダとcontrollersフォルダを用意してそこにファイルを作って行きます。

─── PHP-start
    ├── view 
        ├── view.php
        ├── view1.php    
        ├── view2.php  
    ├── controllers
        ├── index.view.php 
        ├── view1.php    
        ├── view2.php  

ViewとControllerの設定

view.phpは前回までのものを使い、view1と2はタイトルだけ表示するようにしています。

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>PHP</title>
</head>
<body>
	<h1>View1</h1>
</body>
</html>

同じ感じでView2も作っています。

コントローラーはただビューを表示するだけにしています。

<?php

$Comments = $database->selectAll('Comments'); //今回は無視してOKです。

require 'view/view.php';

requireでviewフォルダのviewを表示するようにしています。
他のコントローラーについても同じように書いて行きます。

では、URIの一覧を登録して行きます。

全体のフォルダの構成は下記のようになっています。

─── PHP-start
    ├── core
        ├── Router.php
    ├── index.php  
    ├── routes.php  
    ├── view.php  
    ├── controllers.php  

まずはroutes.phpにURIの一覧を作って行きます。

<?php

$router->define([
		'' => 'controllers/index.view.php',
 		'view1' => 'controllers/view1.php',
 		'view2' => 'controllers/view2.php'
	]);

‘ ‘ 空の状態で渡って来たらcontrollersのindex.view.phpを動かすということを$routerに登録しています。

では、defineの設定を設定して行きましょう

define関数を定義して行くのですが、ルートを設定するだけでなくルートを動かす処理も必要なのでRouter.phpを作ってその中に書いて行きます。

class Router{
	protected $routes = [];

	public function define($routes){
		$this->routes = $routes;
	}

}

index.phpでRouterを動かそう

Routerオブジェクト動かすためにindex.phpを書いて行きます。

<?php

	$database = require 'core/bootstrap.php';

	$router = new Router;

	require 'routes.php';

Routerオブジェクトを$routerにいれて(インスタンス化して)routes.phpを動かしています。これにより、Routerオブジェクトの$routesにURIの一覧が登録されました。

ちなみに、bootstrap.phpでRouter.phpを呼び出しているのでnew Routerが動くようになっています。

<?php

require 'core/Router.php';

では、URIが渡って来たときに適切なコントローラーを動かすための処理を書いて行きましょう。

登録したURIを動かして行きます

まずはindex.phpに追記して行きます。

<?php

	$database = require 'core/bootstrap.php';

	$router = new Router;

	require 'routes.php';

	$uri = trim($_SERVER['REQUEST_URI'], '/'); //追加

	require $router->direct($uri); //追加
URIを取ってくる時のポイント
  • $_SERVERでサーバーの情報が見ることができます。
  • $_SERVERのREQUEST_URIでユーザーが接続しようとしているURIがわかります。
  • REQUEST_URIには / が前後に入るのでそれを取り除くためにtrimを行なっています。

URIを取って来た後にRouterで登録されているURIに接続するための関数(direct)を定義して行きます。

directの設定

<?php

class Router{
	protected $routes = [];

	public function define($routes){
		$this->routes = $routes;
	}

//追加部分
	public function direct($uri){
		if(array_key_exists($uri, $this->routes)){
			return $this->routes[$uri];
		}

		throw new Exception('No route');
	}
}

directでは引数に取って来たURIが登録した$routesのキーにあればそのキーの要素を返すという処理をしています。

最初に定義したように’ ‘空であればcontrollers.index.phpを動かす、という感じです。

ブラウザでの確認

これでルーティングの設定は完了です。
ブラウザで確認してみましょう。

想定通りですね。

localhost:8888/view1にアクセスしたときにはView1、localhost:8888/view2にアクセスしたときにはView2が表示されています。

index.phpを整理しよう

これでルーティングの設定ができたのですが、index.phpでいろんな処理をしているのでもう少しシンプルなものにしていこうと思います。

<?php

	require 'functions.php';

	$database = require 'core/bootstrap.php';

	// $router = new Router;

	// require 'routes.php';

  $uri = trim($_SERVER['REQUEST_URI'], '/');

	// require $router->direct($uri);

	require Router::load('routes.php')->direct($uri);

?>

Routerをインスタンス化してdirect関数を動かすという処理を1行で書いています。ここでroutes.phpを読み込むためのload関数を利用したのでRouter.phpにloadを作って行きます。

load関数でRouterをインスタンス化する

public static function load($file){
		$router = new static; //$router = new Routerに相当する
		require $file; //require 'routes.php'に相当する
		return $router;
	}

new Routerでインスタンス化しない代わりにnew staticでRouterをインスタンス化しています。また、渡されて来た$fileをrequireして$routerインスタンスを返すようにしています。

さらに$uriを読み込む処理もRequest.phpを作りそこで処理していこうと思います。

Request.phpで$uriを処理する

<?php

class Request{
	public static function uri(){
		return trim($_SERVER['REQUEST_URI'], '/');
	}

}

staticメソッドで定義しているのでindex.phpで下記のように呼び出すことができます。

index.phpの確認

$database = require 'core/bootstrap.php';

require Router::load('routes.php')->direct(Request::uri());

だいぶスッキリしたと思います。

まとめ

今回はルーティングの設定方法を紹介しました。

情報を処理するために必要な知識なので覚えておくようにしましょう。データベースの知識と関連づけて行くとWebアプリっぽいものが作れるようになります。

関連記事