小さな管理機能を作ってみよう 第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 ファイルを作成します。
<?php class Config { public static function get(){ return [ 'database' => [ 'host' => 'localhost', 'user' => 'root', 'password' => '', 'database' => 'backoffice', 'charset' => 'utf8' ] ]; } } ?>
Result
jsonで返却するのですが、返却の型を大枠決めていきます。そのためにクラスを作成しておくと、後で悩まないで済みます。
今回は、関数を指定して、返却型に入れていく予定なので、trait を利用していきます。
継承でも良いのですが、ただ、関数を拡張したい場合は有効ですので、覚えておきましょう。
※参考 トレイト
※参考 【図解】phpのtrait(トレイト)とは何か。シンプルな例で説明します。
※参考 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 ファイルを作成します。
<?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 ファイルを作成します。
<?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の処理の流れを簡単に説明します。
- 実行するクラス(ファイル)は、$request[‘process’]に入っている
- $request[‘process’]がない場合は、実行できないので、fatalを返します。
- 実行する関数は、$request[‘method’]に入っている
- $request[‘method’]がない場合は、実行できないので、fatalを返します。
- 同一階層に、$request[‘process’]で指定されたphpファイルを読込、ファイルがない場合は、fatalを返します。
- $request[‘process’]はクラス名なので、インスタンス化します。
- $request[‘method’]はメソッド名なので、$request[‘process’]のクラスにメソッドがない場合は、fatalを返します。
- データベースへの接続を作成したら、指定クラスの指定メソッドに引数として、コネクションとリクエストを入れ、実行します。戻り値は$resultへ代入。
- 戻ってきた$resultを返却
- 例外時は、fatalを返します。
実行するクラス、メソッドは、送信されたパラメータに入っているので、ここから先は自由に作れます。
引数は、データベースへのコネクションと、リクエストになりますので、このルール以外は自由です。
次回からはこれを利用して、プログラムを実際作成していきたいと思います。