Developer

魁!小野の塾 小さな管理機能を作ってみようの巻 第17話
2021.07.22
Lv2

魁!小野の塾 小さな管理機能を作ってみようの巻 第17話

小さな管理機能を作ってみよう 第17話

初心者向け、PHPプログラム構築講座です。
初心者といっても、PHPの勉強を少し行い、LAMP環境が自分で構築でき、少しアプリケーションを作成しているレベルを対象とします。
まったくの初心者の場合は、わからない部分が出てくると思います。
できるだけ細かく説明は入れていきますが、説明がわからない場合は、PHPやMySQLの初心者講座をご覧ください。

対象のスキルレベル

  • LAMP環境の構築
  • PHP言語が読める
  • HTML, CSS, Javascriptが少しわかる
  • Bootstrapのドキュメントをみて、HTMLが書ける
  • Ajax(非同期通信)を利用したことがある
  • SESSIONを利用したことがある

構築環境

  • Windows10
  • XAMPP(PHP7.3.2, MariaDB 10.1.38)

プログラム作成

では、早速PHPのプログラムを作成していきたいと思います。
まずは、Controllerから作成するのですが、その前に、Config、Result、DbConnectionなどを作成していきます。
フォルダーは、「api」にまとめて入れていく予定なので、フォルダーをあらかじめ作成してください。

Config

データベースへの接続設定だけですが、設定ファイルを作成します。
/api/Config.php ファイルを作成します。

/api/Config.php
<?php
class Config {
	public static function get(){
		return [
			'database'	=> [
				'host'		=> 'localhost',
				'user'		=> 'root',
				'password'	=> '',
				'database'	=> 'backoffice',
				'charset'	=> 'utf8'
			]
		];
	}
}
?>
static method Config::get() を呼び出すと、database をキーに、各データベースのプロパティーが取得できます。

Result

jsonで返却するのですが、返却の型を大枠決めていきます。そのためにクラスを作成しておくと、後で悩まないで済みます。
今回は、関数を指定して、返却型に入れていく予定なので、trait を利用していきます。
継承でも良いのですが、ただ、関数を拡張したい場合は有効ですので、覚えておきましょう。

※参考 トレイト
※参考 【図解】phpのtrait(トレイト)とは何か。シンプルな例で説明します。
※参考 PHPのトレイトが怖くて使えない

/api/Result.php ファイルを作成します。

/api/Result.php
<?php
trait Result {
	private $result	= [
		'status'	=> '', // success | error | fatal
		'errors'	=> []
	];
	
	function success(){
		$this->result['status']	= 'success';
	}

	function error($status, $item, $result){
		$this->result['status']	= $status;
		$this->result['errors'][$item]	= $result;
	}

	function setList($key, $record){
		$this->result['list'][$key]	= $record;

	}

	function result(){
		return json_encode($this->result);
	}
}
?>

Resultでは、responseに返す$result という連想配列をもっており、success(), error(), setList(), result()のそれぞれの関数を提供します。

success()
返却状態を正常と設定する

error($status, $item, $result)
返却状態を正常以外に設定(error|fatal)、どの項目でエラーなのかを知るために、項目名、エラーの情報をそれぞれ設定します。

setList($key, $record)
返却リストを設定します。返却リストは複数指定できるように、キーと値のセットにしました。

result()
返却状態を返す関数です。

DbConnection

データベースへの接続を作成するコネクションクラスを作成します。
接続クラスなので、オープンとクローズを作成しておきます。(開いたら閉じよう!!)
接続する際は、文字コードをセットします。(セットしないと文字化けしますよ!)

/api/DbConnection.php ファイルを作成します。

/api/DbConnection.php
<?php
class DbConnection {
	private $db;
	
	function getConnection($config){
		$this->db	= new mysqli(
			$config['database']['host'],
			$config['database']['user'],
			$config['database']['password'],
			$config['database']['database']
		);
		$this->db->set_charset($config['database']['charset']);
		return $this->db;
	}

	function close(){
		$this->db->close();
	}
}
?>

インスタンス変数を所持しているので、static関数になっていないです。

Controller

所持しているリソースができましたので、早速Controllerを作成していきます。

/api/Controller.php ファイルを作成します。

/api/Controller.php
<?php
/**
 * Controller.php
 * 各処理に処理分けします。(process)
 * 関数を実行します。(method)
 */
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Config.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Result.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'DbConnection.php';

class Controller {
	use Result;

	public function process($request){
		try{
			if(is_null($request['process'])){
				$this->error('fatal', '*', '不正な処理が実行されました。(not set process)');
				return $this->result();
			}
			if(is_null($request['method'])){
				$this->error('fatal', '*', '不正な処理が実行されました。(not set method)');
				return $this->result();
			}
			$cls	= dirname(__FILE__).DIRECTORY_SEPARATOR.$request['process'].'.php';
			if(!file_exists($cls)){
				$this->error('fatal', '*', '不正な処理が実行されました。(not exists process)');
				return $this->result();
			}
			require_once $cls;
			$process = new $request['process']();
			if(!method_exists($process, $request['method'])){
				$this->error('fatal', '*', '不正な処理が実行されました。(not exists method)');
				return $this->result();
			}
			$db		= new DbConnection();
			$con	= $db->getConnection(Config::get());
			$method	= $request['method'];
			$result	= $process->$method($con, $request);
			$db->close();
			return $result;
		}catch(Exception $e){
			$this->error('fatal', '*', $e->getMessage());
		}
		return $this->result();
	}
}
?>

proccess 関数のみを定義しています。Resultのtraitは、クラス宣言した下に、use キーワードを利用して指定します。

Contollerの処理の流れを簡単に説明します。

  1. 実行するクラス(ファイル)は、$request[‘process’]に入っている
  2. $request[‘process’]がない場合は、実行できないので、fatalを返します。
  3. 実行する関数は、$request[‘method’]に入っている
  4. $request[‘method’]がない場合は、実行できないので、fatalを返します。
  5. 同一階層に、$request[‘process’]で指定されたphpファイルを読込、ファイルがない場合は、fatalを返します。
  6. $request[‘process’]はクラス名なので、インスタンス化します。
  7. $request[‘method’]はメソッド名なので、$request[‘process’]のクラスにメソッドがない場合は、fatalを返します。
  8. データベースへの接続を作成したら、指定クラスの指定メソッドに引数として、コネクションとリクエストを入れ、実行します。戻り値は$resultへ代入。
  9. 戻ってきた$resultを返却
  10. 例外時は、fatalを返します。

実行するクラス、メソッドは、送信されたパラメータに入っているので、ここから先は自由に作れます。
引数は、データベースへのコネクションと、リクエストになりますので、このルール以外は自由です。

次回からはこれを利用して、プログラムを実際作成していきたいと思います。

魁!小野の塾