魁!小野の塾 小さな管理機能を作ってみようの巻 第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 ファイルを作成します。
class Config {
public static function get(){
return [
‘database’ => [
‘host’ => ‘localhost’,
‘user’ => ‘root’,
‘password’ => ”,
‘database’ => ‘backoffice’,
‘charset’ => ‘utf8’
] ];
}
}
?>
[/php]
Result
jsonで返却するのですが、返却の型を大枠決めていきます。そのためにクラスを作成しておくと、後で悩まないで済みます。
今回は、関数を指定して、返却型に入れていく予定なので、trait を利用していきます。
継承でも良いのですが、ただ、関数を拡張したい場合は有効ですので、覚えておきましょう。
※参考 トレイト
※参考 【図解】phpのtrait(トレイト)とは何か。シンプルな例で説明します。
※参考 PHPのトレイトが怖くて使えない
/api/Result.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);
}
}
?>
[/php]
Resultでは、responseに返す$result という連想配列をもっており、success(), error(), setList(), result()のそれぞれの関数を提供します。
success()
返却状態を正常と設定する
error($status, $item, $result)
返却状態を正常以外に設定(error|fatal)、どの項目でエラーなのかを知るために、項目名、エラーの情報をそれぞれ設定します。
setList($key, $record)
返却リストを設定します。返却リストは複数指定できるように、キーと値のセットにしました。
result()
返却状態を返す関数です。
DbConnection
データベースへの接続を作成するコネクションクラスを作成します。
接続クラスなので、オープンとクローズを作成しておきます。(開いたら閉じよう!!)
接続する際は、文字コードをセットします。(セットしないと文字化けしますよ!)
/api/DbConnection.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();
}
}
?>
[/php]
インスタンス変数を所持しているので、static関数になっていないです。
Controller
所持しているリソースができましたので、早速Controllerを作成していきます。
/api/Controller.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();
}
}
?>
[/php]
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を返します。
実行するクラス、メソッドは、送信されたパラメータに入っているので、ここから先は自由に作れます。
引数は、データベースへのコネクションと、リクエストになりますので、このルール以外は自由です。
次回からはこれを利用して、プログラムを実際作成していきたいと思います。